web-dev-qa-db-ja.com

サブジェクトの別名を持つOpenSSL証明書(バージョン3)

OpenSSLコマンドラインツールを使用して、自己署名証明書を生成しています。 2つの問題を除いて、正常に動作しているようです。サブジェクトの別名(クリティカル)で.cerを作成することができず、バージョン3の証明書を作成する方法を理解できません(これがまだクリティカルであるかどうかはわかりませんが、学習することをお勧めします)バージョンの設定方法)。

誰かがこれを成功させましたか?デフォルトの設定(.cfg)ファイルには、一見明確なドキュメントがあります(以下を参照):

"これは、subjectAltNameおよびissuerAltname用です。メールアドレスをインポートしてください。subjectAltName= email:copy"

ただし、これは機能しません。私の直感は、サブジェクトの代替名がV1仕様に存在しないb/cを表示していないことです。そのため、私は彼のバージョンの設定も追求しています。

これが私が使っている設定ファイルです:

[ req ]
default_bits        = 2048 
default_keyfile     = privkey.pem 
distinguished_name  = req_distinguished_name
emailAddress        = [email protected]
req_extensions          = v3_req
x509_extensions         = v3_ca

[req_distinguished_name]
C = [Press Enter to Continue]
C_default = US 
C_min = 2 
C_max = 2 

O = [Press Enter to Continue]
O_default = default 

0.OU=[Press Enter to Continue]
0.OU_default = default 
1.OU=[Press Enter to Continue]
1.OU_default = PKI 
2.OU=[Press Enter to Continue] 
2.OU_default = ABCD
commonName = Public FQDN of server 
commonName_max = 64

[ v3_req ]
basicConstraints = CA:FALSE
keyUsage = digitalSignature, nonRepudiation, keyEncipherment

[ v3_ca ]
subjectKeyIdentifier   = hash
authorityKeyIdentifier = keyid:always,issuer:always
subjectAltName         = email:[email protected]
issuerAltName          = issuer:copy
22
Kandres22

ここにあなたのための簡単な手順があります

CSRの生成時には-configと-extensionsを使用し、証明書の生成時には-extfileと-extensionsを使用する必要があります

ここに例があります

openssl req -new -nodes -keyout test.key  -out test.csr -days 3650 -subj "/C=US/ST=SCA/L=SCA/O=Oracle/OU=Java/CN=test cert" -config /etc/pki/tls/openssl.cnf -extensions v3_req
openssl x509 -req -days 3650 -in test.csr -CA cacert.pem -CAkey rootCA.key -CAcreateserial -out test.pem -extfile /etc/pki/tls/openssl.cnf  -extensions v3_req

お役に立てれば

16
Raghu K Nair

次のバージョンで動作するようになりました(emailAddressが正しく配置されていません):

[ req ]
default_bits        = 2048 
default_keyfile     = privkey.pem 
distinguished_name  = req_distinguished_name
req_extensions          = v3_req
x509_extensions         = v3_ca

[req_distinguished_name]
C = [Press Enter to Continue]
C_default = US 
C_min = 2 
C_max = 2 

O = [Press Enter to Continue]
O_default = default 

0.OU=[Press Enter to Continue]
0.OU_default = default 
1.OU=[Press Enter to Continue]
1.OU_default = PKI 
2.OU=[Press Enter to Continue] 
2.OU_default = ABCD
commonName = Public FQDN of server 
commonName_max = 64
emailAddress = [Press Enter to Continue] 
emailAddress_default = [email protected]

[ v3_req ]
basicConstraints = CA:FALSE
keyUsage = digitalSignature, nonRepudiation, keyEncipherment

[ v3_ca ]
subjectKeyIdentifier   = hash
authorityKeyIdentifier = keyid:always,issuer:always
subjectAltName         = email:[email protected]
issuerAltName          = issuer:copy

ノート:

  • 使用した証明書を生成するには:

    openssl req -config req.cnf -new -nodes -out req.pem -x509
    
  • issuerAltnameの使用例はあまりありません(もしあれば、どこにいるか知りたいと思います)。
  • authorityKeyIdentifierではissuer:alwaysの使用は推奨されません。
  • email:copyの使用がsubjectAltNameで機能するようになりました。
  • v3_reqセクションは不要です(req_extensions行も同様です)。
8

申し訳ありませんが、このページの他の答えはどれもうまくいきませんでした。私は最後の答えをすべて試しました。私にとってうまくいったのは少しトリックでした:

証明書を要求するとき:

-config '<(cat /etc/ssl/openssl.cnf <(printf "[SAN]\nsubjectAltName=DNS:$SERVER"))' 
-reqexts SAN

証明書に署名するとき:

-extfile '<(cat /etc/ssl/openssl.cnf <(printf "[SAN]\nsubjectAltName=DNS:$SERVER"))' 
-extensions SAN

したがって、混乱はありません。認証局の作成を含め、最初からすべてをカバーする作業スクリプトを次に示します。

# if the server name is undefined, lets default to 'Some-Server'
SERVER="${SERVER:-Some-Server}"

CORPORATION=My-Corp
GROUP=My-Corporate-Group
CITY=City
STATE=State
COUNTRY=US

CERT_AUTH_PASS=`openssl Rand -base64 32`
echo $CERT_AUTH_PASS > cert_auth_password
CERT_AUTH_PASS=`cat cert_auth_password`

# create the certificate authority
openssl \
  req \
  -subj "/CN=$SERVER.ca/OU=$GROUP/O=$CORPORATION/L=$CITY/ST=$STATE/C=$COUNTRY" \
  -new \
  -x509 \
  -passout pass:$CERT_AUTH_PASS \
  -keyout ca-cert.key \
  -out ca-cert.crt \
  -days 36500

# create client private key (used to decrypt the cert we get from the CA)
openssl genrsa -out $SERVER.key

# create the CSR(Certitificate Signing Request)
openssl \
  req \
  -new \
  -nodes \
  -subj "/CN=$SERVER/OU=$GROUP/O=$CORPORATION/L=$CITY/ST=$STATE/C=$COUNTRY" \
  -sha256 \
  -extensions v3_req \
  -reqexts SAN \
  -key $SERVER.key \
  -out $SERVER.csr \
  -config <(cat /etc/ssl/openssl.cnf <(printf "[SAN]\nsubjectAltName=DNS:$SERVER")) \
  -days 36500

# sign the certificate with the certificate authority
openssl \
  x509 \
  -req \
  -days 36500 \
  -in $SERVER.csr \
  -CA ca-cert.crt \
  -CAkey ca-cert.key \
  -CAcreateserial \
  -out $SERVER.crt \
  -extfile <(cat /etc/ssl/openssl.cnf <(printf "[SAN]\nsubjectAltName=DNS:$SERVER")) \
  -extensions SAN \
  -passin pass:$CERT_AUTH_PASS

次に、サブジェクトの別名が最終的な証明書に含まれていることを確認できます。

openssl x509 -in Some-Server.crt -text -noout

関連するセクションは次のとおりです。

    X509v3 extensions:
        X509v3 Subject Alternative Name: 
            DNS:Some-Server

うまくいきました!これは、ブラウザーに認証局をインストールする限り、すべての主要なブラウザー(Chromeを含む)で受け入れられる証明書です。インストールする必要があるthats ca-cert.crt.

以下は、証明書を使用できるようにするngnxのサンプル構成です。

server {
    listen 443 ssl;
    listen [::]:443 ssl;
    server_name  localhost:443;

    ssl_certificate /etc/ssl/certs/Some-Server.crt;
    ssl_certificate_key /etc/ssl/private/Some-Server.key;
    ssl_dhparam /etc/ssl/certs/https-dhparam.pem;

    location / {
        root   /usr/share/nginx/html;
        index  index.html index.htm;
    }
}
6
Jack Davidson

CSR証明書要求を行うためにどのコマンドを使用しましたか?証明書ファイルを作成するためにどのコマンドを使用しましたか?あなたが知っているさまざまな状況に対するさまざまな答え。

多分あなたは入れていません

subjectAltName = email:copy

セクション内

[v3_req]

多分あなたはopenssl x509を使って証明書を生成しているでしょう、もしそうならあなたは使う必要があります

-extfile /etc/pki/tls/openssl.cnf

それがないと設定ファイルを使わないからです

あなたも必要かもしれません

-extensions v3_req

コマンドラインスイッチ

3
user1844882

フォーム入力に基づいてこのコマンドを自動的に生成し、出力を表示する Webベースのツール を開発しました。


UPDATE:参照 certificatetools.com

それは非常に人気が出たので、私はそれを改善し、独自のドメイン名で公開しました。

ダウンロード可能な.csrを提供するだけでなく、それを生成するために使用されたopensslコマンド、および必要なopenssl.cnf構成オプションも提供します。

例:

OpenSSLコマンド

#generate the RSA private key
openssl genpkey -outform PEM -algorithm RSA -pkeyopt rsa_keygen_bits:2048 -out priv.key

#Create the CSR
openssl req -new -nodes -key priv.key -config csrconfig.txt -out cert.csr

OpenSSL CSR構成

[ req ]
default_md = sha256
Prompt = no
req_extensions = req_ext
distinguished_name = req_distinguished_name
[ req_distinguished_name ]
commonName = example.com
countryName = US
stateOrProvinceName = Louisiana
localityName = Slidell
organizationName = Acme Inc.
[ req_ext ]
keyUsage=critical,digitalSignature,keyEncipherment
extendedKeyUsage=critical,serverAuth,clientAuth
subjectAltName = @alt_names
[ alt_names ]
IP.0 = 1.1.1.1
IP.1 = 2.2.2.2
DNS.0 = server1.example.com
DNS.1 = server2.example.com
email.0 = [email protected]
email.1 = [email protected]
1
user40662

私はいくつかのページを参照しましたが、最も重要なヘルプは1からです https://geekflare.com/san-ssl-certificate/ 、2。 https://certificatetools.com / (user40662からの回答を参照)、および3. Raghu K Nairからのコマンドの使用法に関する回答。

その後、私の成功した試み:

san.cnf

[ req ]
default_bits       = 2048
default_md         = sha256
distinguished_name = req_distinguished_name
req_extensions     = v3_req
[ req_distinguished_name ]
countryName            = CN                     # C=
stateOrProvinceName    = Shanghai               # ST=
localityName           = Shanghai               # L=
#postalCode             = 200000                 # L/postalcode=
#streetAddress          = "My Address"           # L/street=
organizationName       = My Corporation         # O=
organizationalUnitName = My Department          # OU=
commonName             = myname.mysoftware.mycorporation.com # CN=
emailAddress           = [email protected]     # CN/emailAddress=
[ v3_req ]
subjectAltName = @alt_names
[ alt_names ]
DNS.1   = myname.mysoftware.mycorporation.com
#DNS.2   = other2.com
#DNS.3   = other3.com

コマンド:

openssl req -x509 -nodes -days 365 -subj "/C=CN/ST=Shanghai/L=Shanghai/O=My Corporation/OU=My Department/CN=myname.mysoftware.mycorporation.com/[email protected]" -keyout privateKey.pem -out certificate.crt -config san.cnf -extensions v3_req
0
robbie fan

v3_reqは、設定ファイルのエントリsubjectAltNameで必須です。コマンド

openssl x509 ... -extfile openssl.cnf -extensions v3_req

SAN=を証明書に挿入します。

0
Dominic

私はこのスレッドが少し古いことを知っていますが、Windowsで誰でも機能する場合に備えて、ファイルがUTF-8でエンコードされていることを確認してください。私の場合、.cnfファイルにエラーがあることを示すエラーが表示されたためNotepad ++でそれを開き、ファイルエンコーディングをUTF-8に設定して保存し、opensslコマンドを再度実行してトリックを作りました。

0
OscarG