機能する自己署名SSL証明書を作成する悪夢

機能する自己署名SSL証明書を作成する悪夢

SSL をインストールする必要があるイントラネット サーバーがあります。

これはopenssl.cnf

[ req ]
default_md              = sha256
distinguished_name      = req_distinguished_name
attributes              = req_attributes
req_extensions          = req_ext
#prompt = no

[ req_distinguished_name ]
countryName                     = US
countryName_min                 = 2
countryName_max                 = 2
stateOrProvinceName             = CHICAGO
localityName                    = CHICAGO
0.organizationName              = MY COMPANY
organizationalUnitName          = IOS DEVELOPMENT
commonName                      = server2.myserver.local
commonName_max                  = 64
emailAddress                    = [email protected]
emailAddress_max                = 64

[ req_attributes ]
challengePassword               = password
challengePassword_min           = 4
challengePassword_max           = 20

[ req_ext ]
subjectAltName = @alt_names
extendedKeyUsage = serverAuth

[alt_names]
DNS.1   = server2.myserver.local
DNS.2   = myserver.local

これは私がこれを作成するために使用しているコマンドです。

  1. ルートCAキーの生成

    openssl genrsa -des3 -out rootCA.key 4096
    

2.ルートCA証明書を生成します

openssl req \
    -x509 -new -nodes \
    -key rootCA.key -sha256 \
    -days 825 \
    -out rootCA.crt \
    -subj /CN=server2.myserver.local \
    -reqexts SAN \
    -extensions SAN \
    -config <(cat ./openssl.cnf \
        <(printf '[SAN]\nsubjectAltName=DNS:server2.myserver.local')) \
    -extensions 'req_ext'
  1. 証明書キーの生成

    openssl genrsa -out mydomain.com.key 4096
    
  2. 証明書を生成する

    openssl req -new -sha256 -key  mydomain.com.key \
     -subj "/C=US/ST=CA/O=MyOrg, Inc./CN=server2.myserver.local" \
     -reqexts SAN \
     -config <(cat ./openssl.cnf \
         <(printf "\n[SAN]\nsubjectAltName=DNS:server2.myserver.local,DNS:myserver.local")) \
     -out mydomain.com.csr
    
  3. CA証明書をp12に変換する

    openssl pkcs12 -export -out ca.p12 -inkey rootCA.key -in rootCA.crt  
    
  4. 証明書をp12に変換する

    openssl pkcs12 -export -out certificate.p12 -inkey mydomain.com.key -in mydomain.com.crt
    

次に、IIS サーバーとデバイスにインストールしca.p12ますcertificate.p12

訪問しようとするとserver2.myserver.local

私は

ここに画像の説明を入力してください

聖人証明書の名の下に、それをどうやって行うのでしょうか?

答え1

ルート CA 証明書は完全に間違っていると思います。CA 証明書はエンド ホスト TLS 証明書とは大きく異なります。両方に同じ構成を使用することはできません。

  • 件名にサーバーのドメインを入れないでください。役に立ちません。CA の場合は、単にCN=My internal CAそのようにすればよいだけです。

  • 拡張子を追加しますbasicConstraints。証明書が CA であることを示す必要があります。

  • 正しいものを追加してくださいkeyUsage。「keyCertSign」と(完全性のため)「cRLSign」が必要です。

  • を追加しないでくださいsubjectAltName。証明書は認証局/発行者用であり、サーバー用ではありません。

  • を追加しないでくださいextendedKeyUsage。CA が発行できる証明書を制限するために使用されることもありますが、この複雑さなしで開始する方がよいでしょう。

  • 後で同一のサブジェクト DN を持つ複数の内部 CA が存在する場合に備えて、を追加することをお勧めしますsubjectKeyIdentifier。(通常、CA DN は一意である必要がありますが、SKI/AKI を使用すると、この点が緩和されます。)

したがって、次のような「CA」構成ファイルが必要になります (コマンド ラインから SAN やその他のものを追加するのはやめてください。それが構成の目的です)。

[ req ]
default_md              = sha256
distinguished_name      = req_distinguished_name
req_extensions          = req_ext

[ req_dn ]
countryName             = US
stateOrProvinceName     = Chicago
organizationName        = Company Name
organizationalUnitName  = iOS development
commonName              = Internal development CA

[ req_ext ]
basicConstraints        = critical, CA:TRUE
keyUsage                = keyCertSign, cRLSign
subjectKeyIdentifier    = hash

一方、エンド エンティティ証明書 (TLS サーバー) には次の拡張機能が必要です。

...
[ req_ext ]
basicConstraints        = CA:FALSE
keyUsage                = digitalSignature, keyEncipherment
extendedKeyUsage        = serverAuth
subjectKeyIdentifier    = hash
authorityKeyIdentifier  = keyid, issuer
subjectAltName          = DNS:server2.myserver.local

次に、IIS サーバーとデバイスに ca.p12 と certificate.p12 をインストールします。

CA の秘密鍵をデバイスにインストールしないでください。サーバーにもインストールしないでください。のみCA 証明書rootCA.crt(公開部分) のみ。他には何もありません。


私の最後のアドバイス:生のCAを作ろうと時間を無駄にしないでくださいopenssl。代わりに簡単RSA(OpenVPNに付属のもの)、またはエクセレント(グラフィカルLinuxアプリ)、またはおそらく数十すでに作成されテストされたプログラムの。

関連情報