web-dev-qa-db-ja.com

ブラウザがローカルホストSSL証明書を信頼するようにする方法は?

aresimilarquestions 、さらには goodanswers でも、特にローカルホストに関心を持たない、または特定のオプション/ソリューション(自己署名vs CA)について尋ねる。

オプションは何ですか?彼らはどのように比較しますか?なんでこうするの?

9
x-yuri

tl; dr独自のCAによって発行された証明書を生成します(以下のスクリプトを参照)

ここに私が見つけたものがあります。私が間違っているところを修正してください。

CA(証明機関)があります。他のCA(中間CA)、またはサーバー(エンドエンティティ証明書)に対して証明書を発行(CSRに署名)します。それらのいくつかはルート機関です。彼らは自分で発行した自己署名証明書を持っています。つまり、通常、サーバー証明書からルート証明書に至る信頼のチェーンがあります。そして、ルート証明書を保証する人はいません。そのため、OSには、ルート証明書ストア(または信頼ポリシーストア)、信頼できるルート証明書のシステム全体のリストがあります。ブラウザには、システム全体のリストとユーザーが信頼する証明書で構成される、信頼できる証明書の独自のリストがあります。

Chromiumでは、chrome:// settings/certificatesで証明書を管理します。 Firefoxでは、Preferences > Privacy & Security > Certificates > View Certificates。どちらにも、信頼されたルート証明書のリストである[権限]タブがあります。 [サーバー]タブ、信頼できるサーバー証明書のリスト。

CSR(証明書署名要求)を作成した証明書を取得するには、CAに送信します。 CAはCSRに署名し、その過程で信頼できる証明書に変換します。

証明書とCSRは、情報と公開キーを含むフィールドの集まりです。一部のフィールドは拡張機能と呼ばれます。 CA証明書は、basicConstraints = CA:trueを含む証明書です。

Developer Tools > SecurityでChromiumの証明書エラーを検査できます。

システム全体で証明書を信頼する

OSのルート証明書ストアを変更すると、ブラウザーを再起動する必要があります。変更するには:

# trust anchor path/to/cert.crt
# trust anchor --remove path/to/cert.crt

trustは、CA証明書を「authority」カテゴリ(trust list)、または「other-entry」カテゴリに配置します。 CA証明書は、ブラウザーの[権限]タブ、または[サーバー]タブに表示されます。

Firefoxは、Chromiumとは異なり、OSのルート証明書ストアからのサーバー証明書を信頼しません。どちらもOSのルート証明書ストアからのCA証明書を信頼します。

ブラウザで証明書を信頼する

ChromiumおよびFirefoxでは、証明書を[権限]タブに追加(インポート)できます。非CA証明書をインポートしようとすると、「認証局ではありません」というメッセージが表示されます。ファイルを選択すると、ダイアログが表示され、そこで信頼設定(証明書を信頼するタイミング)を指定できます。サイトを機能させるための関連設定は、「Webサイトを識別するためにこの証明書を信頼する」です。

Chromiumでは、[サーバー]タブで証明書を追加(インポート)できます。ただし、最終的には[認証機関]タブ(CA証明書、ファイル選択後に信頼設定ダイアログが表示されない)、または[その他]タブ(非CA証明書の場合)に表示されます。

Firefoxでは、証明書を[サーバー]タブに正確に追加することはできません。例外を追加します。そして、そこでは拡張子のない(貧しい)証明書を信頼することができます。

自己署名証明書拡張機能

私のシステムには、証明書の次のデフォルト設定(追加される拡張機能)が付属しています。

basicConstraints = critical,CA:true
subjectKeyIdentifier = hash
authorityKeyIdentifier = keyid:always,issuer

/ etc/ssl/openssl.cnf 、セクション v3_ca から取得。さらに詳しく here

さらに、Chromiumは、subjectAltName = DNS:$domainがない場合、証明書を無効と見なします。

非自己署名証明書拡張機能

セクションから [ usr_cert ] of /etc/ssl/openssl.cnf

basicConstraints = CA:FALSE
subjectKeyIdentifier = hash
authorityKeyIdentifier = keyid,issuer

ブラウザが自己署名証明書を信頼する場合

Chromiumが自己署名証明書を信頼するには、basicConstraints = CA:truesubjectAltName = DNS:$domainが必要です。 Firefoxでは、これでさえ十分ではありません。

basicConstraints = critical,CA:true
subjectKeyIdentifier = hash
authorityKeyIdentifier = keyid:always,issuer
subjectAltName = DNS:$domain

ブラウザが自身のCAによって発行された証明書を信頼する場合

Firefoxには拡張機能は必要ありませんが、ChromiumにはsubjectAltNameが必要です。

opensslチートシート

openssl genpkey -algorithm RSA -out "$domain".key-秘密鍵を生成( man

openssl req -x509 -key "$domain".key -out "$domain".crt-自己署名証明書を生成( man

-subjがなければ、一般名(CN)、組織(O)、地域(L)などの識別名(DN)に関する質問をします。 「事前に」答えることができます:-subj "/CN=$domain/O=$org"

subjectAltName拡張子を追加するには、すべてを指定する構成を用意するか、configにセクションを追加して-extensionsスイッチでopensslに名前を指定する必要があります。

    -config <(cat /etc/ssl/openssl.cnf - <<END
[ x509_ext ]
basicConstraints = critical,CA:true
subjectKeyIdentifier = hash
authorityKeyIdentifier = keyid:always,issuer
subjectAltName = DNS:$domain
END
    ) -extensions x509_ext

openssl req -new -key "$domain".key -out "$domain".csr-CSRを生成し、-subjオプションを取ることができます( man

openssl x509 -req -in "$domain".csr -days 365 -out "$domain".crt \ -CA ca.crt -CAkey ca.key -CAcreateserial-CSRに署名( man

-CAcreateserialなしでは機能しません。最後に生成された証明書のシリアル番号を保持するca.srlファイルを作成します。 subjectAltNameを追加するには、-extfileスイッチが必要です。

    -extfile <(cat <<END
basicConstraints = CA:FALSE
subjectKeyIdentifier = hash
authorityKeyIdentifier = keyid,issuer
subjectAltName = DNS:$domain
END
    )

openssl req -in $domain.csr -text -noout-CSRを表示( man

openssl x509 -in $domain.crt -text -noout-証明書の表示( man

自己署名証明書を生成する

(Firefoxが機能するには例外が必要です)

#!/usr/bin/env bash
set -eu
org=localhost
domain=localhost

Sudo trust anchor --remove "$domain".crt || true

openssl genpkey -algorithm RSA -out "$domain".key
openssl req -x509 -key "$domain".key -out "$domain".crt \
    -subj "/CN=$domain/O=$org" \
    -config <(cat /etc/ssl/openssl.cnf - <<END
[ x509_ext ]
basicConstraints = critical,CA:true
subjectKeyIdentifier = hash
authorityKeyIdentifier = keyid:always,issuer
subjectAltName = DNS:$domain
END
    ) -extensions x509_ext

Sudo trust anchor "$domain".crt

独自のCAによって発行された証明書を生成する

#!/usr/bin/env bash
set -eu
org=localhost-ca
domain=localhost

Sudo trust anchor --remove ca.crt || true

openssl genpkey -algorithm RSA -out ca.key
openssl req -x509 -key ca.key -out ca.crt \
    -subj "/CN=$org/O=$org"

openssl genpkey -algorithm RSA -out "$domain".key
openssl req -new -key "$domain".key -out "$domain".csr \
    -subj "/CN=$domain/O=$org"

openssl x509 -req -in "$domain".csr -days 365 -out "$domain".crt \
    -CA ca.crt -CAkey ca.key -CAcreateserial \
    -extfile <(cat <<END
basicConstraints = CA:FALSE
subjectKeyIdentifier = hash
authorityKeyIdentifier = keyid,issuer
subjectAltName = DNS:$domain
END
    )

Sudo trust anchor ca.crt

Webサーバーの構成

Nginx:

server {
    listen  443  ssl;
    ssl_certificate  ssl/localhost.crt;
    ssl_certificate_key  ssl/localhost.key;
    ...

モルボ:

carton exec morbo --listen='https://*:3000?cert=localhost.crt&key=localhost.key' \
    site.pl

追伸Chromium 65.0.3325.162、Firefox 59.0、およびopenssl-1.1.0.gを実行しています。

どうやら、Windowsにはtrustユーティリティがありません。 Windowsでは、 2つのストア :ローカルマシンと現在のユーザー証明書ストアがあります。 Local Machine Certificate Storeを使用する意味はありません。現在のユーザーだけのために機能しているからです。次に、サブストアがあります。信頼できるルート認証局と中間認証局ストアの2つの事前定義済みサービスが最も重要です。一般的にコマンドラインでは root and CA と呼ばれます。

Chromeの証明書マネージャーにアクセスするには、chrome:// settings /?search = Manage%20certificatesをフォローし、[証明書の管理]をクリックします。最も興味深いのは、信頼されたルート証明機関および中間証明機関タブです。

証明書を管理する1つの方法は、 コマンドライン を使用することです。

>rem list Current User > Trusted Root Certification Authorities store
>certutil.exe -store -user root

>rem list Local Machine > Intermediate Certification Authorities store
>certutil.exe -store -enterprise CA

>rem GUI version of -store command
>certutil.exe -viewstore -user CA

>rem add certificate to Current User > Trusted Root Certification Authorities store
>certutil.exe -addstore -user root path\to\file.crt

>rem delete certificate from Current User > Trusted Root Certification Authorities store by serial number
>certutil.exe -delstore -user root 03259fa1

>rem GUI version of -delstore command
>certutil.exe -viewdelstore -user CA

結果は次のとおりです(ローカルマシンと現在のユーザー証明書ストアの両方):

root
    localhost.crt
        error
    ca.crt
        appears in Trusted Root Certification Authorities tab
CA
    localhost.crt
        doesn't work, appears in Other People tab
    ca.crt
        doesn't work, appears in Intermediate Certification Authorities tab

その他のオプションは、エクスプローラーで証明書をダブルクリックする、Chromeの証明書マネージャーから証明書をインポートする、証明書MMCスナップイン(certmgr.mscを実行)]、または CertMgr.exe

grepがインストールされている場合、証明書がどこにあるかをすばやく確認する方法は次のとおりです。

>certutil.exe -store -user root | grep "localhost\|^root\|^CA" ^
& certutil.exe -store -user CA | grep "locahost\|^root\|^CA" ^
& certutil.exe -store -enterprise root | grep "localhost\|^root\|^CA" ^
& certutil.exe -store -enterprise CA | grep "localhost\|^root\|^CA"

したがって、CA証明書を[現在のユーザー]> [信頼されたルート証明機関]ストアにインストールするのが最良の選択肢のようです。そして、ブラウザの再起動 を忘れないように確認してください。

追加の読書

OpenSSL
genpkey
req
x509
OpenSSL認証局
localhostの証明書
iamaCA-独自の認証局になり、証明書を発行する
Firefoxおよび自己署名証明書
Chromeの証明書エラーページのバイパス

10
x-yuri