Chrome 58で動作するopensslを使用した自己署名証明書の生成


52

Chrome 58以降、依存する自己署名証明書を受け入れなくなりましたCommon Namehttps ://productforums.google.com/forum/#!topic/chrome/zVo3M8CgKzQ;context-place=topicsearchin/chrome/category $ 3ACanary%7Csort: relevance%7Cspell:false

代わりにを使用する必要がありSubject Alt Nameます。:私は以前に自己署名証明書を生成する方法については、このガイド、次のされていますhttps://devcenter.heroku.com/articles/ssl-certificate-self私は必要なので、素晴らしい仕事をserver.crtし、server.key私がやっている何のためにファイルを。今では、SANChrome 58で動作しないすべての試みを含む新しい証明書を生成する必要があります。

これが私がやったことです:

上記のHerokuの記事の手順に従ってキーを生成しました。次に、新しいOpenSSL構成ファイルを作成しました。

[ req ]
default_bits        = 2048
distinguished_name  = req_distinguished_name
req_extensions      = san
extensions          = san
[ req_distinguished_name ]
countryName         = US
stateOrProvinceName = Massachusetts
localityName        = Boston
organizationName    = MyCompany
[ san ]
subjectAltName      = DNS:dev.mycompany.com

次にserver.crt、次のコマンドでを生成しました:

openssl req \
-new \
-key server.key \
-out server.csr \
-config config.cnf \
-sha256 \
-days 3650

私はMacを使用しているのでserver.crt、キーチェーンでファイルを開き、システム証明書に追加しました。次に、それをに設定しAlways Trustます。

SAN値を設定する構成ファイルを除き、これらは以前のバージョンのChromeで自己署名証明書を生成および信頼するために使用したのと同様の手順でした。

ただし、この後もERR_CERT_COMMON_NAME_INVALIDChrome 58で取得できます。

回答:


62

私の解決策:

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

ステータス:私のために働く


2
サブシェルの素晴らしい使用。あなたはそれを少し単純化できると思います:-config <(cat /System/Library/OpenSSL/openssl.cnf ; printf '[SAN]\nsubjectAltName=DNS:dev.mycompany.com')
jrwren

1
Subject Alt Nameエラーは表示されなくなりましたが、一般名に関するエラーが表示され、ダウンロードした証明書を「常に信頼する」に設定しても機能しません。何かご意見は?@bcardarella
rugbert

2
Chrome 59の更新により、証明書に次のようなエラーが表示されます。サイトの証明書チェーンに問題があります(net :: ERR_CERT_COMMON_NAME_INVALID)。
theHarsh

1
に変更dev.company.namelocalhost、ローカルホストからローカル開発サイトを提供するためにこれが機能しました。macOSでは、キーチェーンに証明書を追加し、SSLを「常に信頼」に設定する必要もありました。
ダニエルM.

1
これは最も簡単な解決策であり、sslconfを使用したりCAをインストールしたりする必要はありません。
bp。

16

Windowsでは、このスクリプトをSSLフォルダーにmakeCERT.batとして保存します。これらのファイルが作成されます:example.cnf、example.crt、example.key

@echo off

REM IN YOUR SSL FOLDER, SAVE THIS FILE AS: makeCERT.bat
REM AT COMMAND LINE IN YOUR SSL FOLDER, RUN: makecert
REM IT WILL CREATE THESE FILES: example.cnf, example.crt, example.key
REM IMPORT THE .crt FILE INTO CHROME Trusted Root Certification Authorities
REM REMEMBER TO RESTART APACHE OR NGINX AFTER YOU CONFIGURE FOR THESE FILES

REM PLEASE UPDATE THE FOLLOWING VARIABLES FOR YOUR NEEDS.
SET HOSTNAME=example
SET DOT=com
SET COUNTRY=US
SET STATE=KS
SET CITY=Olathe
SET ORGANIZATION=IT
SET ORGANIZATION_UNIT=IT Department
SET EMAIL=webmaster@%HOSTNAME%.%DOT%

(
echo [req]
echo default_bits = 2048
echo prompt = no
echo default_md = sha256
echo x509_extensions = v3_req
echo distinguished_name = dn
echo:
echo [dn]
echo C = %COUNTRY%
echo ST = %STATE%
echo L = %CITY%
echo O = %ORGANIZATION%
echo OU = %ORGANIZATION_UNIT%
echo emailAddress = %EMAIL%
echo CN = %HOSTNAME%.%DOT%
echo:
echo [v3_req]
echo subjectAltName = @alt_names
echo:
echo [alt_names]
echo DNS.1 = *.%HOSTNAME%.%DOT%
echo DNS.2 = %HOSTNAME%.%DOT%
)>%HOSTNAME%.cnf

openssl req -new -x509 -newkey rsa:2048 -sha256 -nodes -keyout %HOSTNAME%.key -days 3560 -out %HOSTNAME%.crt -config %HOSTNAME%.cnf

13

ここに私のために働く解決策があります:

CAキーと証明書を作成する

# openssl genrsa -out server_rootCA.key 2048
# openssl req -x509 -new -nodes -key server_rootCA.key -sha256 -days 3650 -out server_rootCA.pem

server_rootCA.csr.cnfを作成します

# server_rootCA.csr.cnf
[req]
default_bits = 2048
prompt = no
default_md = sha256
distinguished_name = dn

[dn]
C=DE
ST=Berlin
L=NeuKoelln
O=Weisestrasse
OU=local_RootCA
emailAddress=ikke@server.berlin
CN = server.berlin

v3.ext構成ファイルを作成する

# v3.ext
authorityKeyIdentifier=keyid,issuer
basicConstraints=CA:FALSE
keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment
subjectAltName = @alt_names

[alt_names]
DNS.1 = server.berlin

サーバーキーを作成する

# openssl req -new -sha256 -nodes -out server.csr -newkey rsa:2048 -keyout server.key -config <( cat server_rootCA.csr.cnf )

サーバー証明書を作成する

# openssl x509 -req -in server.csr -CA server_rootCA.pem -CAkey server_rootCA.key -CAcreateserial -out server.crt -days 3650 -sha256 -extfile v3.ext

Apache2サイトファイル、HTTPS(ポート443)セクションに証明書とキーを追加します

SSLCertificateFile    /etc/apache2/ssl/server.crt
SSLCertificateKeyFile    /etc/apache2/ssl/server.key

server_rootCA.pemをサーバーからマシンにコピーします。

# scp you@server.berlin:~/server_rootCA.pem .

.. Chromiumブラウザに追加します

Chromium -> Setting -> (Advanced) Manage Certificates -> Import -> 'server_rootCA.pem'

あなたはすべて完了です!

PS機能的なCAとサーバー証明書のペアを作成する代わりに(上記の手順に従って)、HTTPサーバー設定でHSTSヘッダーを無効にするだけで済みます。これにより、ChromiumはHTTPSを強制できなくなり、ユーザーはカスタムCA(server_rootCA.pem)証明書を取得してインストールしなくても、[詳細設定]→[your.urlに進む(安全でない)]をクリックできます。言い換えれば、HSTSを無効にする必要があるため、HTTPまたは安全でないHTTPS接続を介してサイトを公開することができます(注意してください!)。

Apache2の場合、以下をサイトファイルのHTTP(ポート80)セクションに追加します

Header unset Strict-Transport-Security
Header always set Strict-Transport-Security "max-age=0;includeSubDomains"

Debian / Apache2.4 + Debian / Chromium 59でテスト済み

https://ram.k0a1a.net/self-signed_https_cert_after_chrome_58


後で個々の証明書に署名するルートCA機関のルートに行くことが、Chromeで完全に認証される唯一の方法です。また、1つの証明書をインストールするだけで済むという利点もあります。おかげで
ジェフ・

4
誰かがなぜこの分野の誰も-config <( cat server_rootCA.csr.cnf )がただの代わりにバシズムを使うように見えるのか私に説明できますか-config server_rootCA.csr.cnf
シーザー

問題を回避できるApacheヘッダーに関する回答を更新してください 仮想ホストの定義内でこれらがどこに行くべきかを指摘できますか。私はいくつかの代替手段を試しましたが、それでもhttpsでサイトにアクセスできません。ありがとう
ニコスM.

12

これを機能させる方法の例を示す素晴らしい答えがいくつかありますが、あなたの試みでどこがうまくいかなかったかを説明するものはありません。OpenSSLは、直観に反する場合がありますので、説明する価値があります。

まず、余談ですが、OpenSSLはデフォルトで、設定で指定した識別名の値を無視します。それらを使用する場合は、構成に追加prompt = no する必要があります。さらに、このコマンドは、書かれているように、証明書自体ではなく証明書要求のみを生成する ため、-daysコマンドは何も実行しません。

指定したこのコマンドを使用して証明書要求を生成し、結果を検査すると、サブジェクトの代替名が存在します。

$ openssl req -new -key server.key -out server.csr -config config.cnf -sha256
$ openssl req -text -noout -in server.csr
Certificate Request:
    Data:
        Version: 1 (0x0)
        Subject: C = US, ST = Massachusetts, L = Boston, O = MyCompany
        Subject Public Key Info:
            Public Key Algorithm: rsaEncryption
                Public-Key: (2048 bit)
                Modulus:
                    ...
                Exponent: 65537 (0x10001)
        Attributes:
        Requested Extensions:
            X509v3 Subject Alternative Name:
                DNS:dev.mycompany.com
    Signature Algorithm: sha256WithRSAEncryption
         ...

ただし、herokuリンクのコマンドを使用して証明書を生成し、結果を調べると、サブジェクトの代替名が欠落しています。

$ openssl x509 -req -sha256 -days 365 -in server.csr -signkey server.key -out server.crt
$ openssl x509 -text -noout -in server.crt
Certificate:
    Data:
        Version: 1 (0x0)
        Serial Number:
            89:fd:75:26:43:08:04:61
    Signature Algorithm: sha256WithRSAEncryption
        Issuer: C = US, ST = Massachusetts, L = Boston, O = MyCompany
        Validity
            Not Before: Jan 21 04:27:21 2018 GMT
            Not After : Jan 21 04:27:21 2019 GMT
        Subject: C = US, ST = Massachusetts, L = Boston, O = MyCompany
        Subject Public Key Info:
            Public Key Algorithm: rsaEncryption
                Public-Key: (2048 bit)
                Modulus:
                    ...
                Exponent: 65537 (0x10001)
    Signature Algorithm: sha256WithRSAEncryption
         ...

その理由は、デフォルトでは、OpenSSLは拡張機能をリクエストから証明書にコピーしないからです。通常、証明書は顧客からの要求に基づいてCAによって作成/署名され、一部の拡張機能は、要求で定義された拡張機能を盲目的に信頼する場合にCAが意図していた以上の権限を証明書に付与できます。

OpenSSLに拡張機能をコピーするように指示する方法はありますが、証明書を生成するときに設定ファイルに拡張機能を提供するだけではなく、IMHOの方が手間がかかります。

既存の構成ファイルを使用しようとしても、最上位レベルのセクションにマークが付け[req]られ、x509コマンドではなくreqコマンドにのみ適用されるため、機能しません。トップレベルのセクションマーカーは必要ないため、最初の行を削除するだけで、要求または証明書の生成の両方で正常に機能します。

$ openssl x509 -req -sha256 -days 365 -in server.csr -signkey server.key -out server.crt -extfile config.cnf

または、最初に要求を作成してから証明書を作成するのではなく-x509reqコマンドの引数を使用して単一のコマンドで自己署名証明書を生成できます。この場合、[req]セクションセクションはreqコマンドによって読み取られて使用されるため、セクションラインを削除する必要はありません 。

$ openssl req -x509 -sha256 -days 365 -key server.key -out server.crt -config config.cnf

要約すると、上記のコマンドで使用される変更された構成ファイルは次のとおりです。

default_bits        = 2048
distinguished_name  = dn
x509_extensions     = san
req_extensions      = san
extensions          = san
prompt              = no
[ dn ]
countryName         = US
stateOrProvinceName = Massachusetts
localityName        = Boston
organizationName    = MyCompany
[ san ]
subjectAltName      = DNS:dev.mycompany.com

2
これは、SANなしで証明書が発行された理由を理解するのに役立つ唯一の説明です(私の場合、構成ファイルにx509_extensionsを含める必要がありました)
ダニエルビアズモア

2

私の解決策は、メインopenssl.cnfをそのままにして、最後に[ cert_www.example.com ]www.example.comが証明書を作成するWebサイトであるような新しいセクションを追加し、その中に必要なものを追加するsubjectAltNameことです(そして他に何か)。もちろん、セクションには任意の名前を付けることができます。

その後、openssl req以前のようにコマンドを実行し、-extensions cert_www.example.comそのコンテンツを取得する-subjために追加するだけで、すべてのDN情報を直接追加することができます。

作成後、使用前に証明書の内容を確認することを忘れないでください。 openssl x509 -text


1

構成が組み込まれたBashスクリプト

bashを使用するプラットフォーム間で動作するシェルスクリプトとして。HOSTNAMEシェルに設定されたenvを想定するか、選択したホスト名を指定します。例えばself_signed_cert.sh test

set -e

if [ -z "$1" ]; then
  hostname="$HOSTNAME"
else
  hostname="$1"
fi

local_openssl_config="
[ req ]
prompt = no
distinguished_name = req_distinguished_name
x509_extensions = san_self_signed
[ req_distinguished_name ]
CN=$hostname
[ san_self_signed ]
subjectAltName = DNS:$hostname, DNS:localhost
subjectKeyIdentifier = hash
authorityKeyIdentifier = keyid:always,issuer
basicConstraints = CA:true
keyUsage = nonRepudiation, digitalSignature, keyEncipherment, dataEncipherment, keyCertSign, cRLSign
extendedKeyUsage = serverAuth, clientAuth, timeStamping
"

openssl req \
  -newkey rsa:2048 -nodes \
  -keyout "$hostname.key.pem" \
  -x509 -sha256 -days 3650 \
  -config <(echo "$local_openssl_config") \
  -out "$hostname.cert.pem"
openssl x509 -noout -text -in "$hostname.cert.pem"

上記は多かれ少なかれopensslが必要とする最低限の設定ファイル情報を注入します。

DNS:localhostlocalhostを介したテストをより簡単に行えるように、SANとして追加されていることに注意してください。不要な場合は、スクリプトから余分なビットを削除します。

クレジット

bcardarellaの答えは素晴らしいです(不十分な担当者のためにコメント/投票できません)。ただし、答えはプラットフォーム固有の既存のopenssl configファイルの場所を使用します...したがって:

私のために働く

明らかに、自分の特定のプラットフォーム用のopenssl構成ファイルを見つけて、正しい場所に置き換えるだけです。

テスト

テストする方法として、のtest.cert.pemchromeの権限にインポートしchrome://settings/certificatesます:

openssl s_server -key test.key.pem -cert test.cert.pem -accept 20443 -www &
openssl_pid=$!
google-chrome https://localhost:20443

そしてテスト後

kill $openssl_pid
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.