web-dev-qa-db-ja.com

* .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

次に、ファイルcerts/cacert.pemを問題なく動作するchromiumの機関にインポートします。

次に、証明書リクエストを作成します。

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の両方でセキュアとして表示されます。

DNS.1をlocalに、DNS.2を*.localに設定しようとしたところ、chromeとERR_SSL_SERVER_CERT_BAD_FORMATSEC_ERROR_REUSED_ISSUER_AND_SERIALを取得しました。シリアルファイルと証明書を生成する前のインデックスファイル。

4

[〜#〜] csr [〜#〜]にSANを追加したが、caに拡張機能を含めるように伝えなかった証明書のCSRから。 https://security.stackexchange.com/questions/150078/missing-x509-extensions-with-an-openssl-generated-certificate またはcaのmanページも参照してください at _copy_extensions_

編集:alsoca設定で_x509_extensions_を指定する必要があります。または、存在するセクションをポイントしている場合に、コマンドラインオプション_-extensions_と同等ですが、あまり便利ではありません。 CAで必要な拡張機能が必要ない場合は、空にすることができます。 CSRonlyからの拡張機能のケースを試したことがなく、ほとんどのCAにとって非現実的な設定ではないため、最初はこれに気付きませんでした。 none以外の_copy_extensions_を指定した場合(およびCSRにいくつかある)、_x509_extensions_を指定しない場合、cadoesは拡張機能を証明書に入れますが、does not拡張機能が存在する場合、標準(rfc5280など)で要求されるように、証明書のバージョンをv3に設定します。

これがバグかどうかは議論の余地があります。マンページには、_x509_extensions/extensions_がv3設定を制御し、notで_copy_extensions_について同様のことを言っていることは、そうではないことを示していますが、IMHOは非常に最適ではない機能です。編集:これはバグであり修正される予定ですが、それまでは回避策を使用してください https://unix.stackexchange.com/a/394465/59699

しかし、私のテストでは、これは実際には問題を解決しませんでした。証明書のSANandCNに_*.local_があり、(現在)有効であるにもかかわらず、Firefox(53.0.2)とChrome(59.0.3071.109)は、SSL_ERROR_CERT_DOMAIN_ERRORおよびERR_CERT_COMMON_NAME_INVALIDでそれぞれ拒否します。私は彼らが通常の2+レベルのロジックからlocalを除外していないのではないかと思い、_*.example.local_を試しました:Chromeはそれを受け入れますが、Firefoxは受け入れません。私はまた、_*.example.org_とChromeとIE11の両方をthatのように試しましたが、Firefoxはまだ試していません(もちろん、_.org_のような実際のTLDに自分の名前を割り当てます) DNSが機能するはずの方法ではありません)。

これは私が行き詰まっています。いくつかの作業でOpenSSLを作成して、ほとんどすべてのものが含まれている証明書を生成できますが、FirefoxとChromeはacceptを知りません。私はそれを調べて、何か見つけたら更新しようとします。


あなたが意味することを願っています Common Nameとして_*.local_をサーバーCSRにのみ指定し、CA(自己署名)証明書には指定しませんでした。 CAとリーフ証明書のサブジェクト名が同じである場合、何も確実に機能しません。編集:編集したQは、それらが正しく異なっていることを確認します。使用したcaポリシーで必要な国、州、組織の指定についても触れていませんが。

「自己署名」は用語であり、同じkeyで署名されていることを意味します。 CA証明書は自己署名されています。サーバー証明書は、独自のキーを使用して自分で署名されていますが、not自己署名されています。自己署名証明書の指示を非自己署名証明書に適用しようとすることは、問題の一部でした。

そしてGillesは、署名アルゴリズムのmd5についても正しいと指摘しています。

編集:_openssl ca_セットアップのシリアル(およびインデックス)を 'リセット'することは、CA証明書および名前を永久に破棄しない限り、お勧めできません。標準では、特定のCAが証明書内の同じシリアル値で複数の証明書を発行してはならないとし、シリアルファイルは_openssl ca_(および_x509 -req_)がこれを実装する方法です。 「本当の」(パブリック)CAは現在、単純なカウンターを使用していませんが、エントロピーを含めてPKI(google hashclash)への衝突攻撃をブロックしていますが、これはあなたのような個人CAの問題ではありません。ブラウザーがリーフ証明書を永続的に格納することを期待していないので、同じシリアル名とCA名を持つ複数の証明書が表示された場合、ブラウザー(またはその他の信頼関係者)が不満を抱いているとすぐに信じることができるため、古い証明書と新しい証明書の両方が表示されます長時間実行しない限り、1つのプロセスで-永続的な「例外」にする場合は、Firefoxを含め、適切なストアにインポートしない限り。

4

ワイルドカード証明書は、.local.comなどのトップレベルドメインでは許可されておらず、FirefoxやIEでも受け入れられません。 https: //crbug.com/736715

1
EricLaw

少なくとも1つの明らかな問題は、 MD5 で署名された証明書を作成していることです。 MD5はしばらくの間推奨されておらず、特に2012年以降、証明書が壊れています。信頼できるサーバーでしばらくサポートされていません。

変化する default_md md5からdefault_md sha256

MD5を推奨するチュートリアルに従っている場合、それを捨ててください。古すぎて何の役にも立ちません。

他の問題がないかどうかは確認していません。サーバーログが役立つはずです。