ssl - チェーン - 自己証明書 作成 windows




opensslを使って自己署名証明書を作成するには? (9)

キーを生成する

/etc/apparmor.d/usr.sbin.mysqld/etc/mysql/*.pem rが含まれているので、 /etc/apparmor.d/usr.sbin.mysqldは証明書の格納に/etc/mysqlを使用しています。

sudo su -
cd /etc/mysql
openssl genrsa -out ca-key.pem 2048;
openssl req -new -x509 -nodes -days 1000 -key ca-key.pem -out ca-cert.pem;
openssl req -newkey rsa:2048 -days 1000 -nodes -keyout server-key.pem -out server-req.pem;
openssl x509 -req -in server-req.pem -days 1000 -CA ca-cert.pem -CAkey ca-key.pem -set_serial 01 -out server-cert.pem;
openssl req -newkey rsa:2048 -days 1000 -nodes -keyout client-key.pem -out client-req.pem;
openssl x509 -req -in client-req.pem -days 1000 -CA ca-cert.pem -CAkey ca-key.pem -set_serial 01 -out client-cert.pem;

設定を追加する

/etc/mysql/my.cnf

[client]
ssl-ca=/etc/mysql/ca-cert.pem
ssl-cert=/etc/mysql/client-cert.pem
ssl-key=/etc/mysql/client-key.pem

[mysqld]
ssl-ca=/etc/mysql/ca-cert.pem
ssl-cert=/etc/mysql/server-cert.pem
ssl-key=/etc/mysql/server-key.pem

私のセットアップでは、ubuntuサーバーにログ: /var/log/mysql/error.log

フォローアップノート:

  • SSL error: Unable to get certificate from '...'

    apparmors configにない場合、Mysqlはあなたのcertファイルへの読み込みアクセスを拒否される可能性があります 。 前の手順で述べたように、すべての証明書をapparmorによってデフォルトで承認された/etc/mysql/ディレクトリに.pemファイルとして保存します(またはapparmor / SELinuxを変更して保存した場所にアクセスできるようにします)。

  • SSL error: Unable to get private key

    あなたのmysqlサーバのバージョンはデフォルトのrsa:2048フォーマットをサポートしていないかもしれません。

    Covertがrsa:2048をplain rsa生成しました:

    openssl rsa -in server-key.pem -out server-key.pem
    openssl rsa -in client-key.pem -out client-key.pem
    
  • ローカルサーバーがsslをサポートしているかどうかを確認します

    mysql -u root -p
    mysql> show variables like "%ssl%"; 
    +---------------+----------------------------+
    | Variable_name | Value                      |
    +---------------+----------------------------+
    | have_openssl  | YES                        |
    | have_ssl      | YES                        |
    | ssl_ca        | /etc/mysql/ca-cert.pem     |
    | ssl_capath    |                            |
    | ssl_cert      | /etc/mysql/server-cert.pem |
    | ssl_cipher    |                            |
    | ssl_key       | /etc/mysql/server-key.pem  |
    +---------------+----------------------------+
    
  • dbへの接続がsslで暗号化されていることを確認しています

    接続の確認

    MySQLインスタンスにログインすると、次のクエリを発行できます。

    show status like 'Ssl_cipher'; 
    

    接続が暗号化されていない場合、結果は空白になります。

    mysql> show status like 'Ssl_cipher'; 
    +---------------+-------+ 
    | Variable_name | Value | 
    +---------------+-------+ 
    | Ssl_cipher    |       |  
    +---------------+-------+ 
    1 row in set (0.00 sec) 
    

    さもなければ、それは使用中の暗号器のための非ゼロの長さのストリングを示すでしょう:

    mysql> show status like 'Ssl_cipher'; 
    +---------------+--------------------+ 
    | Variable_name | Value              | 
    +---------------+--------------------+ 
    | Ssl_cipher    | DHE-RSA-AES256-SHA |  
    +---------------+--------------------+ 
    1 row in set (0.00 sec) 
    
  • 特定のユーザの接続にsslを要求する ( 'require ssl'):

    • SSL

    アカウントにSSL暗号化接続のみを許可するようにサーバーに指示します。

    GRANT ALL PRIVILEGES ON test.* TO 'root'@'localhost'
      REQUIRE SSL;
    

    接続するには、クライアントはサーバ証明書を認証するために--ssl-caオプションを指定し、さらに--ssl-keyと--ssl-certオプションを指定する必要があります。--ssl-caオプションも--ssl-capathオプションも指定されていない場合、クライアントはサーバ証明書を認証しません。

別のリンク:長いチュートリアルはこちらhttp://www.madirish.net/214

私は組み込みLinuxデバイスにhttpsサポートを追加しています。 これらの手順で自己署名証明書を生成しようとしました。

openssl req -new > cert.csr
openssl rsa -in privkey.pem -out key.pem
openssl x509 -in cert.csr -out cert.pem -req -signkey key.pem -days 1001
cat key.pem>>cert.pem

これはうまくいきますが、たとえばGoogle Chromeでエラーが発生します。

これはおそらくあなたが探しているサイトではありません!
サイトのセキュリティ証明書は信頼できません。

何か不足していますか? これは、自己署名証明書を作成する正しい方法ですか?


何か不足していますか? これは、自己署名証明書を作成する正しい方法ですか?

自己署名証明書を簡単に作成できます。 openssl reqコマンドを使用するだけです。 ブラウザーやコマンドラインツールなど、クライアントの最大の選択によって消費されるものを作成するのは難しいことがあります。

ブラウザには独自の要件があり、IETFよりも制限が厳しいため、難しいです。 ブラウザーで使用される要件は、 CA /ブラウザー・フォーラムで文書化されています(以下の参考文献を参照)。 この制限は、(1)トラストアンカーと(2)DNS名という2つの重要な領域で発生します。

最新のブラウザ(2014年の2015年に使用しているWarezのような)では、トラストアンカーに戻ってくる証明書が必要で、証明書にDNS名を特定の形で表示したいと考えています。 また、ブラウザは自己署名入りのサーバー証明書に対して積極的に移動しています

一部のブラウザでは、自己署名入りのサーバー証明書を簡単にインポートすることはできません。 実際には、Androidのブラウザのような一部のブラウザでは使用できません。 したがって、完全な解決策はあなた自身の権限になることです。

あなた自身の権限になることができなければ、DNS名を取得して、証明書を成功の最大のチャンスにする必要があります。 しかし、私はあなたがあなた自身の権威になることを奨励するでしょう。 あなた自身の権限になることは簡単で、すべての信頼問題(自分よりも信頼できる人は誰ですか?

これはおそらくあなたが探しているサイトではありません!
サイトのセキュリティ証明書は信頼できません。

これは、ブラウザが事前定義されたトラストアンカーのリストを使用してサーバー証明書を検証するためです。 自己署名付き証明書は信頼できるアンカーにチェーンバックしません。

これを避ける最善の方法は次のとおりです。

  1. 独自の権限を作成する(つまり、CAになる)
  2. サーバーの証明書署名要求(CSR)を作成する
  3. CAキーを使用してサーバーのCSRに署名する
  4. サーバー証明書をサーバーにインストールする
  5. クライアントにCA証明書をインストールする

ステップ1 - 独自の権限を作成するということは、 CA: trueとの自己署名付き証明書を作成することを意味します。 これはSubjectとIssuerが同じエンティティであり、CAがBasic Constraintsでtrueに設定されていること(クリティカルとマークする必要があります)、キーの使用法はkeyCertSigncrlSign (CRLを使用する場合)、Subject Key Identifier )はAuthority Key Identifier(AKI)と同じです。

独自の認証局になるには、「 どのように証明書署名要求に署名しますか?」を参照してください。 スタックオーバーフロー。 次に、ブラウザが使用するトラストストアにCAをインポートします。

ステップ2 - 4は、 StartcomCAcertようなCAのサービスを登録するときに、公に面するサーバーの場合におおまかに行うことです。 ステップ1と5は、第三者の権限を回避し、あなた自身の権限(自分よりも信頼できる人)として行動することを可能にします。

ブラウザの警告を回避するための最善の方法は、サーバーの証明書を信頼することです。 しかし、Androidのデフォルトブラウザーのようなブラウザーの中には、それをさせるものがありません。 したがって、プラットフォーム上で動作することはありません。

自己署名入りの証明書を信頼しないブラウザー(および他の同様のユーザーエージェント)の問題は、Internet of Things(IoT)において大きな問題になるでしょう。 たとえば、サーモスタットや冷蔵庫に接続してプログラムするときに、どうなるでしょうか? 答えは、ユーザーエクスペリエンスに関する限り、何も良いことではありません。

W3CのWebAppSecワーキンググループは、この問題を検討し始めています。 たとえば、「 プロポーザル:HTTPを非セキュアとしてマークする 」を参照してください。

opensslを使って自己署名証明書を作成するには?

以下のコマンドと構成ファイルは、自己署名証明書を作成します(署名要求の作成方法も示しています)。 自己署名証明書に使用されるDNS名は、 Common Name(CN)ではなく、 Subject Alternate Name(SAN)にあります。

DNS名は、 subjectAltName = @alternate_namesという行の設定ファイルを使用してSANに配置されます(コマンド行で実行する方法はありません)。 設定ファイルにalternate_namesセクションがあります(好みに合わせて調整する必要があります):

[ alternate_names ]

DNS.1       = example.com
DNS.2       = www.example.com
DNS.3       = mail.example.com
DNS.4       = ftp.example.com

# Add these if you need them. But usually you don't want them or
#   need them in production. You may need them for development.
# DNS.5       = localhost
# DNS.6       = localhost.localdomain
# DNS.7       = 127.0.0.1

# IPv6 localhost
# DNS.8     = ::1

IETFとCA / Browser Forumsの両方がその習慣を特定しているので、DNS名をSANではなくCNに入れておくことが重要です。 また、CNのDNS名は推奨されなくなりました(ただし、禁止されていない)ことを指定しています。 CNにDNS名を入力する場合は、CA / BポリシーでSANに含める必要あります。 したがって、件名の代替名の使用を避けることはできません。

SANにDNS名を指定しないと、CA / Browser Forumのガイドラインに従ったブラウザやその他のユーザエージェントで証明書の検証が失敗します。

関連:ブラウザはCA / Browser Forumのポリシーに従います。 IETFポリシーではありません。 これは、OpenSSL(一般にIETFに続く)で作成された証明書が、ブラウザ(ブラウザがCA / Bに従う)で検証されないことがある理由の1つです。 それらは異なる標準であり、異なる発行ポリシーと異なる検証要件を持っています。

自己署名入りの証明書を作成します-x509オプションが-x509ます)。

openssl req -config example-com.conf -new -x509 -sha256 -newkey rsa:2048 -nodes \
    -keyout example-com.key.pem -days 365 -out example-com.cert.pem

署名リクエストを作成する-x509オプションがないことに-x509 ):

openssl req -config example-com.conf -new -sha256 -newkey rsa:2048 -nodes \
    -keyout example-com.key.pem -days 365 -out example-com.req.pem

自己署名証明書を印刷する

openssl x509 -in example-com.cert.pem -text -noout

署名要求を印刷する

openssl req -in example-com.req.pem -text -noout

設定ファイル( -configオプションで渡される)

[ req ]
default_bits        = 2048
default_keyfile     = server-key.pem
distinguished_name  = subject
req_extensions      = req_ext
x509_extensions     = x509_ext
string_mask         = utf8only

# The Subject DN can be formed using X501 or RFC 4514 (see RFC 4519 for a description).
#   Its sort of a mashup. For example, RFC 4514 does not provide emailAddress.
[ subject ]
countryName         = Country Name (2 letter code)
countryName_default     = US

stateOrProvinceName     = State or Province Name (full name)
stateOrProvinceName_default = NY

localityName            = Locality Name (eg, city)
localityName_default        = New York

organizationName         = Organization Name (eg, company)
organizationName_default    = Example, LLC

# Use a friendly name here because its presented to the user. The server's DNS
#   names are placed in Subject Alternate Names. Plus, DNS names here is deprecated
#   by both IETF and CA/Browser Forums. If you place a DNS name here, then you 
#   must include the DNS name in the SAN too (otherwise, Chrome and others that
#   strictly follow the CA/Browser Baseline Requirements will fail).
commonName          = Common Name (e.g. server FQDN or YOUR name)
commonName_default      = Example Company

emailAddress            = Email Address
emailAddress_default        = [email protected]

# Section x509_ext is used when generating a self-signed certificate. I.e., openssl req -x509 ...
[ x509_ext ]

subjectKeyIdentifier        = hash
authorityKeyIdentifier  = keyid,issuer

# You only need digitalSignature below. *If* you don't allow
#   RSA Key transport (i.e., you use ephemeral cipher suites), then
#   omit keyEncipherment because that's key transport.
basicConstraints        = CA:FALSE
keyUsage            = digitalSignature, keyEncipherment
subjectAltName          = @alternate_names
nsComment           = "OpenSSL Generated Certificate"

# RFC 5280, Section 4.2.1.12 makes EKU optional
#   CA/Browser Baseline Requirements, Appendix (B)(3)(G) makes me confused
#   In either case, you probably only need serverAuth.
# extendedKeyUsage  = serverAuth, clientAuth

# Section req_ext is used when generating a certificate signing request. I.e., openssl req ...
[ req_ext ]

subjectKeyIdentifier        = hash

basicConstraints        = CA:FALSE
keyUsage            = digitalSignature, keyEncipherment
subjectAltName          = @alternate_names
nsComment           = "OpenSSL Generated Certificate"

# RFC 5280, Section 4.2.1.12 makes EKU optional
#   CA/Browser Baseline Requirements, Appendix (B)(3)(G) makes me confused
#   In either case, you probably only need serverAuth.
# extendedKeyUsage  = serverAuth, clientAuth

[ alternate_names ]

DNS.1       = example.com
DNS.2       = www.example.com
DNS.3       = mail.example.com
DNS.4       = ftp.example.com

# Add these if you need them. But usually you don't want them or
#   need them in production. You may need them for development.
# DNS.5       = localhost
# DNS.6       = localhost.localdomain
# DNS.7       = 127.0.0.1

# IPv6 localhost
# DNS.8     = ::1

Chromeでは次の操作が必要な場合があります。 さもなければ、 ChromeはCommon Nameが無効であると訴えるかもしれません( ERR_CERT_COMMON_NAME_INVALID 。 この例では、SAN内のIPアドレスとCNの関係はどうなっているのでしょうか。

# IPv4 localhost
# IP.1       = 127.0.0.1

# IPv6 localhost
# IP.2     = ::1

X.509 / PKIX証明書のDNS名の取り扱いに関する他の規則があります。 ルールについては、次のドキュメントを参照してください。

RFC 6797とRFC 7469は、他のRFCやCA / Bドキュメントよりも制限があるため、リストされています。 RFC 6797と7469ではIPアドレス許可されていません


1つのライナーFTW。 私はそれを簡単に保つのが好きです。 必要なすべての引数を含む1つのコマンドを使用しないでください。 これは私がそれを好きな方法です - これはx509証明書を作成し、それはPEMキーです:

openssl req -x509 \
 -nodes -days 365 -newkey rsa:4096 \
 -keyout self.key.pem \
 -out self-x509.crt \
 -subj "/C=US/ST=WA/L=Seattle/CN=example.com/[email protected]" 

その1つのコマンドには、通常、証明書の詳細を提供するすべての回答が含まれています。 このようにしてparamsを設定してコマンドを実行し、出力を取得してからコーヒーを飲むことができます。

>>詳細はこちら<<


2017 1つのライナー:

openssl req \
-newkey rsa:2048 \
-x509 \
-nodes \
-keyout server.pem \
-new \
-out server.pem \
-subj /CN=localhost \
-reqexts SAN \
-extensions SAN \
-config <(cat /System/Library/OpenSSL/openssl.cnf \
    <(printf '[SAN]\nsubjectAltName=DNS:localhost')) \
-sha256 \
-days 3650

これはChrome 57でも動作します。別の設定ファイルを使用せずにSANを提供するためです。 hereから答えを得here 。 これにより、秘密鍵と証明書の両方を含む単一の.pemファイルが作成されます。 必要に応じてそれらを.pemファイルに分割することができます。


oneliner v2017:

centos:

openssl req -x509 -nodes -sha256 -newkey rsa:2048 \
-keyout localhost.key -out localhost.crt \
-days 3650 \
-subj "CN=localhost" \
-reqexts SAN -extensions SAN \
-config <(cat /etc/pki/tls/openssl.cnf <(printf "\n[SAN]\nsubjectAltName=IP:127.0.0.1,DNS:localhost"))

ubuntu:

openssl req -x509 -nodes -sha256 -newkey rsa:2048 \
-keyout localhost.key -out localhost.crt \
-days 3650 \
-subj "CN=localhost" \
-reqexts SAN -extensions SAN \
-config <(cat /etc/ssl/openssl.cnf <(printf "\n[SAN]\nsubjectAltName=IP:127.0.0.1,DNS:localhost"))

あなたは正しい一般的な手順を持っています。 コマンドの構文は次のとおりです。

openssl req -new -key {private key file} -out {output file}

ただし、既知の認証局(CA)で証明書を検証して、ブラウザが識別情報を検証できなかったため、警告が表示されます。

これは自己署名証明書であるため、CAは存在しないため、警告を無視して安全に進めることができます。 公衆インターネット上の誰かが認識できる本当の証明書を取得したい場合、手順は以下のとおりです。

  1. 秘密鍵を生成する
  2. その秘密鍵を使用してCSRファイルを作成する
  3. CAにCSRを提出する(Verisignその他)
  4. 受信した証明書をWebサーバー上のCAからインストールする
  5. 証明書の種類に応じて他の証明書を認証チェーンに追加する

私は、 https://bigthinkingapplied.com/secure-the-connection-installing-certificates-on-3-common-web-servers/ポストにこれに関する詳細を掲載していhttps://bigthinkingapplied.com/secure-the-connection-installing-certificates-on-3-common-web-servers/


以下は、 @ diegowsの答えに書かれているオプションです。

openssl req -x509 -newkey rsa:2048 -keyout key.pem -out cert.pem -days XXX
req

PKCS#10証明書要求と証明書生成ユーティリティ。

-x509

このオプションは、証明書要求の代わりに自己署名証明書を出力します。 これは、通常、テスト証明書または自己署名付きルートCAを生成するために使用されます。

-newkey arg

このオプションは、新しい証明書要求と新しい秘密鍵を作成します。 引数はいくつかの形式のうちの1つをとります。 rsa:nbitsnbitsはビット数)は、サイズがnbitsの RSAキーを生成します。

-keyout filename

これは、新しく作成された秘密鍵を書き込むためのファイル名を与えます。

-out filename

これはデフォルトで書き込む出力ファイル名または標準出力を指定します。

-days n

-x509オプションが使用されている場合、これは証明書を証明する日数を指定します。 デフォルトは30日です。

-nodes

このオプションを指定すると、秘密鍵が作成された場合、秘密鍵は暗号化されません。

ドキュメントは実際には上記よりも詳細です、私はここでそれを要約しました。


次のコマンドは、すべてのニーズに対応します。

openssl req -x509 -newkey rsa:4096 -sha256 -nodes -keyout example.key -out example.crt -subj "/CN=example.com" -days 3650

example.comドメインの証明書が作成されます。

  • 比較的強い(2018年現在)
  • 3650日(約10年)有効です。

次のファイルが作成されます。

  • 秘密鍵: example.key
  • 証明書: example.crt

すべての情報がコマンドラインで提供されるため、迷惑な対話型入力はありません。 また、この単一のOpenSSL呼び出しによって、必要なすべての手順が実行されます。秘密鍵の生成から自己署名証明書までです。

証明書は自己署名されており、ユーザーが手動で受け入れる必要があるため、短い期限切れまたは弱い暗号を使用することは意味がありません。

将来、RSAキーには4096ビット以上、 sha256よりも強力なハッシュアルゴリズムを使用することをお勧めしますが、2018年以降はこれらはsha256な値です。 最新のブラウザーでサポートされている間は十分に強力です。

備考:理論的には、 -nodesパラメータ( "no DES encryption"を意味する)を-nodesすることができます。この場合、 example.keyはパスワードで暗号化されます。 ただし、サーバーにパスワードを保存する必要があるか、または再起動するたびにパスワードを手動で入力する必要があるため、サーバーインストールにはほとんど役に立ちません。


私はコメントすることはできませんので、別の答えとしてこれを置くでしょう。 私は受け入れられた1ライナーの答えでいくつかの問題を発見した:

  • ワンライナーには鍵のパスフレーズが含まれています。
  • 1ライナーはSHA1を使用します。SHA1は、多くのブラウザでコンソールに警告を表示します。

ここでは、パスフレーズを削除し、警告を抑制するためのセキュリティを強化し、-subjを渡して完全な質問リストを削除するコメントを提案する簡略化されたバージョンを示します。

openssl genrsa -out server.key 2048
openssl rsa -in server.key -out server.key
openssl req -sha256 -new -key server.key -out server.csr -subj '/CN=localhost'
openssl x509 -req -sha256 -days 365 -in server.csr -signkey server.key -out server.crt

'localhost'を必要なドメインに置き換えます。 opensslはパスフレーズを要求するので、最初の2つのコマンドを1つずつ実行する必要があります。

2つを.pemファイルに結合するには:

cat server.crt server.key > cert.pem




x509certificate