何か不足していますか?これは自己署名証明書を作成する正しい方法ですか?
自己署名証明書を作成するのは簡単です。openssl req
コマンドを使用するだけです。ブラウザーやコマンド ライン ツールなど、多数のクライアントが使用できるものを作成するのは難しい場合があります。
ブラウザには独自の要件セットがあり、IETFよりも制限が厳しいため、これは困難です。ブラウザーで使用される要件は、CA/ブラウザー フォーラムで文書化されています(以下の参照を参照)。制限は、(1) トラスト アンカーと (2) DNS 名の 2 つの重要な領域で発生します。
最新のブラウザー (2014/2015 で使用しているウェアーズなど) は、トラスト アンカーにチェーン バックする証明書を必要とし、DNS 名が証明書で特定の方法で提示されることを望んでいます。また、ブラウザは自己署名サーバー証明書に積極的に反対しています。
一部のブラウザーでは、自己署名サーバー証明書を簡単にインポートできない場合があります。実際、Android のブラウザーなど、一部のブラウザーではできません。したがって、完全な解決策は、あなた自身の権威になることです。
独自の機関にならない場合は、証明書が成功する可能性を最大限に高めるために、DNS 名を正しく取得する必要があります。しかし、私はあなたがあなた自身の権威になることをお勧めします. 自分自身の権威になるのは簡単で、すべての信頼の問題を回避します (自分以上に信頼できる人はいますか?)。
これはおそらくあなたが探しているサイトではありません!
サイトのセキュリティ証明書は信頼されていません!
これは、ブラウザが事前定義されたトラスト アンカーのリストを使用してサーバー証明書を検証するためです。自己署名証明書はトラステッド アンカーに連鎖しません。
これを回避する最善の方法は次のとおりです。
- 独自の機関を作成する (つまり、CAになる)
- サーバーの証明書署名要求 (CSR) を作成する
- サーバーの CSR に CA キーで署名します
- サーバー証明書をサーバーにインストールする
- クライアントに CA 証明書をインストールする
ステップ 1 -独自の機関CA: true
を作成する とは、適切なキーの使用法を使用して自己署名証明書を作成することを意味します。つまり、SubjectとIssuerは同じエンティティであり、CA はBasic Constraintsで true に設定され(クリティカルとしてもマークする必要があります)、キーの使用法はkeyCertSign
and crlSign
(CRL を使用している場合) であり、Subject Key Identifier (SKI) はAuthority Key Identifier (AKI)と同じです。
独自の認証局になるには、「認証局で証明書署名要求に署名するにはどうすればよいですか?」を参照してください。スタック オーバーフローで。次に、ブラウザが使用する Trust Store に CA をインポートします。
手順 2 ~ 4 は、 StartcomやCAcertなどの CA のサービスを登録するときに、公開サーバーに対して現在行うこととほぼ同じです。ステップ 1 と 5 により、第三者の権限を回避し、自分自身の権限として行動することができます (自分以上に信頼できる人はいますか?)。
ブラウザの警告を回避する次善の方法は、サーバーの証明書を信頼することです。ただし、Android の既定のブラウザーなど、一部のブラウザーではそれができません。したがって、プラットフォームでは決して機能しません。
ブラウザー (および他の同様のユーザー エージェント)が自己署名証明書を信頼しないという問題は、モノのインターネット (IoT) で大きな問題になるでしょう。たとえば、サーモスタットや冷蔵庫に接続してプログラムするとどうなるでしょうか? 答えは、ユーザー エクスペリエンスに関する限り、良いことは何もないということです。
W3C の WebAppSec ワーキング グループは、この問題の調査を開始しています。たとえば、Proposal: Marking HTTP As Non-Secureを参照してください。
OpenSSL で自己署名証明書を作成する方法
以下のコマンドと構成ファイルにより、自己署名証明書が作成されます (署名要求の作成方法も示されています)。自己署名証明書に使用される DNS 名は、共通名 (CN)ではなく、サブジェクト代替名 (SAN)にあります。
DNS 名は、次の行を使用して構成ファイルを介して SAN に配置されますsubjectAltName = @alternate_names
(コマンド ラインを介して行う方法はありません)。次に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
# IP.1 = 127.0.0.1
# IP.2 = ::1
DNS 名を CN ではなく SAN に配置することが重要です。これは、IETF と CA/Browser Forums の両方が慣例を指定しているためです。また、CN 内の DNS 名が非推奨であることも指定しています (ただし、禁止されているわけではありません)。DNS 名を CN に入れる場合は、CA/B ポリシーの下で SAN に含める必要があります。したがって、Subject Alternate Name の使用を避けることはできません。
DNS 名を SAN に配置しない場合、証明書は、CA/Browser Forum のガイドラインに従うブラウザーやその他のユーザー エージェントでの検証に失敗します。
関連: ブラウザーは CA/Browser Forum のポリシーに従います。IETF ポリシーではありません。これが、OpenSSL (一般に IETF に従う) で作成された証明書がブラウザー (ブラウザーは CA/B に従う) で検証されない場合がある理由の 1 つです。それらは異なる標準であり、異なる発行ポリシーと異なる検証要件があります。
自己署名証明書を作成します-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
(オプションがないことに注意してください)。
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 it's 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 = test@example.com
# 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 がコモンネームが無効であると文句を言うことがあります ( )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 アドレスを許可していません。