*.local SSL証明書の作成

*.local SSL証明書の作成

すべての* .local Webサイトがhttpsを介して実行できるようにSSL証明書を設定しようとしています。私のすべての.localドメインは私のローカルコンピュータを指しています。私はウェブサイトを開発するときにこれを使います。多くの新機能(地理的な場所、サービスワーカーなど)にはSSLが必要です。

最新バージョンのChrome / Firefoxでは、以前の自己署名証明書が機能しなくなったようです。

以下は、これらのガイドラインを組み合わせた後の手順です。 https://deliciousbrains.com/https-locally-without-browser-privacy-errors/

https://codeghar.wordpress.com/2008/03/17/create-a-certificate-authority-and-certificates-with-openssl/

https://stackoverflow.com/questions/27294589/creating-self-signed-certificate-for-domain-and-subdomains-neterr-cert-commo

これは私の設定ファイルです。

#..................................
[ ca ]
default_ca = CA_default
[ CA_default ]
dir = /home/*****/Sites/root-ca
serial = $dir/serial
database = $dir/index.txt
new_certs_dir = $dir/certs
certificate = $dir/certs/cacert.pem
private_key = $dir/private/cakey.pem
default_days = 3000
default_md = sha256
preserve = no
email_in_dn = no
nameopt = default_ca
certopt = default_ca
policy = policy_match
copy_extensions = copyall
[ policy_match ]
countryName = match
stateOrProvinceName = match
organizationName = match
organizationalUnitName = optional
commonName = supplied
emailAddress = optional
[ req ]
default_bits = 2048 # Size of keys
default_keyfile = key.pem # name of generated keys
default_md = md5 # message digest algorithm
string_mask = nombstr # permitted characters
distinguished_name = req_distinguished_name
req_extensions = v3_req
[ req_distinguished_name ]
# Variable name Prompt string
#------------------------- ----------------------------------
0.organizationName = Organization Name (company)
organizationalUnitName = Organizational Unit Name (department, division)
emailAddress = Email Address
emailAddress_max = 40
localityName = Locality Name (city, district)
stateOrProvinceName = State or Province Name (full name)
countryName = Country Name (2 letter code)
countryName_min = 2
countryName_max = 2
commonName = Common Name (hostname, IP, or your name)
commonName_max = 64
# Default values for the above, for consistency and less typing.
# Variable name Value
#------------------------ ------------------------------
0.organizationName_default = *****
localityName_default = *****
stateOrProvinceName_default = *****
countryName_default = *****
emailAddress_default = *****
[ v3_ca ]
basicConstraints = CA:TRUE
subjectKeyIdentifier = hash
authorityKeyIdentifier = keyid:always,issuer:always
subjectAltName       = @alternate_names
[ v3_req ]
subjectKeyIdentifier = hash
basicConstraints     = CA:FALSE
keyUsage             = digitalSignature, keyEncipherment
subjectAltName       = @alternate_names
nsComment            = "OpenSSL Generated Certificate"

[ alternate_names ]

DNS.1       = *.local

まず、新しい認証局を作成します。

openssl req -new -x509 -extensions v3_ca -keyout private/cakey.pem -out certs/cacert.pem -days 3000 -config conf/caconfig.cnf

ここでは、一般名を私の名前として指定しました。

Common Name (hostname, IP, or your name) []:Jonathan Hodgson

その後、そのファイルをChromeの権威あるファイルにインポートし、certs/cacert.pem正しく機能しました。

次に、証明書要求を生成します。

openssl req -extensions v3_req -new -nodes -out local.req.pem -keyout private/local.key.pem -config conf/caconfig.cnf

ここでは、一般名を *.local と指定します。

Common Name (hostname, IP, or your name) []:*.local

その後、リクエストに署名します。

openssl ca -out certs/local.cert.pem  -config conf/caconfig.cnf -infiles local.req.pem

私のhttp設定に次のファイルを追加しました。

<VirtualHost *:80>
    ServerName test.local
    ServerAlias *.local
    VirtualDocumentRoot /home/jonathan/Sites/%-2/public_html
    CustomLog /home/jonathan/Sites/access.log vhost_combined
    ErrorLog /home/jonathan/Sites/error.log
</VirtualHost>

<VirtualHost *:443>
    ServerName test.local
    ServerAlias *.local
    VirtualDocumentRoot /home/jonathan/Sites/%-2/public_html
    CustomLog /home/jonathan/Sites/access.log vhost_combined
    ErrorLog /home/jonathan/Sites/error.log
    SSLEngine On
    SSLCertificateFile /home/jonathan/Sites/root-ca/certs/local.cert.pem
    SSLCertificateKeyFile /home/jonathan/Sites/root-ca/private/local.key.pem
</VirtualHost>

Apacheを再起動しましたが、まだNET::ERR_CERT_COMMON_NAME_INVALID

私はすでに実行した構成ファイルにsubjectAltNameを追加する必要があるためだと思います。

どう違うのか教えてください。

助けてくれてありがとう。

編集する

問題はワイルドカードと関係があると思います。 Alternate_namesをexample.localに設定し、要求された一般名をexample.localに設定すると、example.localはChromeとFirefoxの両方で安全であるように見えます。

localDNS.1をに設定し、DNS.2をに設定してからChromeとFirefox*.localに入りました。証明書を生成する前に、必ずシリアルファイルとインデックスファイルをリセットしてください。ERR_SSL_SERVER_CERT_BAD_FORMATSEC_ERROR_REUSED_ISSUER_AND_SERIAL

答え1

次に SAN を追加します。企業の社会的責任しかし、あなたはそうではありませんでした。caCSRを含むTell拡張証明書から。バラより https://security.stackexchange.com/questions/150078/missing-x509-extensions-with-an-openssl-generated-certificateまたはマニュアルページca ウェブでも存在するcopy_extensions

編集者: あなた返品構成または同じですが、あまり便利ではないコマンドラインオプションx509_extensionsで指定する必要があります。どちらの場合も、存在するセクションを指していますが、CAが必要とする拡張が不要な場合は空にすることができます。 CSRの拡張事例を一度も試したことがないので、最初はこれに気づかなかった。ca-extensionsただほとんどのCAでは実用的ではない構成です。copy_extensions別のものを指定したがnone(CSRに一部がある)指定しなかっx509_extensionsた場合ca する証明書に拡張子を入れますが、確かに拡張がある場合は、標準(rfc5280など)が要求するように証明書のバージョンをv3に設定します。

これがバグかどうかは議論の余地があります。マンページにはx509_extensions/extensionsv3設定を制御するように指示されています。いいえそういうことを言えばそうではcopy_extensionsないことを意味するかもしれませんが、IMHOは確かに非常に最適な機能です。編集:これはバグで修正される予定ですが、それまでは回避策を使用してください。https://unix.stackexchange.com/a/394465/59699

しかし、私のテストでは実際に問題は解決されませんでした。証明書がすでに*.localSANにある場合でもそしてCNと(現在)他の方法では機能しますが、私のFirefox(53.0.2)とChrome(59.0.3071.109)はそれぞれSSL_ERROR_CERT_DOMAIN_ERRORとERR_CERT_COMMON_NAME_INVALIDを使用して拒否します。私は彼らがlocal一般的なレベル2+ロジックを除いて試してみると思います*.example.local。 Chromeはこれを許可しますが、Firefoxはそうではありません。私も試してみましたが、*.example.orgChromeとIE11の両方が好きです。それしかし、それでもFirefoxではありません(もちろん、実際のTLDで自分に名前を割り当てることは.orgDNSが機能する方法ではありません)。

これが私をジレンマに陥る。一部の操作により、OpenSSLはユーザーが望むほとんどすべてを含む証明書を生成できますが、FirefoxとChromeは受け入れるわかりません。この問題を調査し、何かが見つかったら更新するよう努力します。


*.local自己署名(CA)証明書ではなく、サーバーCSRにCommonNameのみを提供することを意味してください。 CA とリーフ証明書のサブジェクト名が同じであれば、何も安定して動作しません。編集:編集された質問によると、質問が正しく異なることが確認されました。ca使用中のポリシーで要求される国、州、組織の指定は記載されていません。

「自己署名」は、同じ署名を意味する用語である。。 CA証明書は自己署名されています。あなたのサーバー証明書はあなた自身の鍵であなたが直接署名しますが、いいえ自己署名。自己署名証明書の指示を自己署名されていない証明書に適用しようとすることも問題の一部です。

Gillesは、md5署名アルゴリズムについても正しいです。

編集:CA証明書を完全に削除しない限り、設定のシリアル番号(およびインデックス)を「リセット」することはopenssl caお勧めできません。そして名前彼らは使用されます。標準には、特定のCAが同じシーケンス値を持つ複数の証明書を発行してはいけませopenssl cax509 -req。今日、「実際の」(パブリック)CAには、単純なカウンタを使用せずにgoogle hashclash(PKI)への衝突攻撃を防ぐためのエントロピーが含まれていますが、これはあなたのようなプライベートCAでは問題ではありません。ブラウザ(または他の信頼者)が同じシーケンスとCA名を持つ複数の証明書を見ると、満足できないと簡単に信じることができます。しかし、ブラウザがリーフ証明書を保持したくないので、以前の証明書も同時に表示できます。長い間実行されていない限り、プロセスの時間と新しい証明書 - 永続的な「例外」に設定されている場合は、Firefoxを含むそのリポジトリにインポートしない限り。

答え2

ワイルドカード証明書は最上位ドメイン(たとえば、.localまたは)には許可されず、.comFirefoxまたはIEではワイルドカード証明書は許可されません。https://crbug.com/736715

答え3

少なくとも1つの明らかな問題は、署名付き証明書を生成することです。MD5。 MD5はしばらく使用されておらず、2012年から証明書が破損しています。しばらく評判の良いサーバーはこれをサポートしていませんでした。

に変更default_md md5default_md sha256

MD5 を推奨するチュートリアルに従っている場合は破棄してください。あまりにも古いので、役に立たない。

他の問題があるかどうか確認していないことをご了承ください。サーバーログが役に立ちます。

答え4

どちらの答えも私には役に立ちませんでしたが、将来の要件に合ったPowershellスクリプトを思いつきました。

#openssl req -x509 -newkey rsa:4096 -sha256 -days 3650 -nodes -keyout localhost-CA.pem -out localhost-CA.crt -subj '/emailAddress=<redacted>/O=<redacted>/CN=<redacted>/C=US' -extensions v3_ca -addext 'nsCertType=sslCA' # uncomment to generate a root CA cert.
'basicConstraints=CA:FALSE`
extendedKeyUsage=serverAuth`
subjectAltName=IP.1:127.0.0.1,IP.2:::1,DNS:localhost' | Set-Content sign.conf
Invoke-Expression "openssl req -new -sha256 -key localhost.pem -out localhost.csr -subj '/emailAddress=<redacted>/O=<redacted>/CN=<redacted>/C=US' $((Get-Content sign.conf | ForEach-Object { "-addext '$_'" }) -join ' ')"
openssl x509 -req -in localhost.csr -CA localhost-CA.crt -CAkey localhost-CA.pem -CAcreateserial -out localhost.crt -days 3650 -sha256 -extfile sign.conf -extensions default
Remove-Item sign.conf

構成ファイルを台無しにすることなくCSRを生成するために使用された新しい証明書生成ユーティリティに同じ拡張子を渡します。これは小さすぎるものの私の好みに比べてあまりにも多くです。生成された証明書はV3です。

関連情報