[解決済み】認証局でCertificate Signing Requestに署名する方法は?
質問
SSL Certificate Signing Requestに署名する方法を検索したところ、いくつかの方法が見つかりました。
-
を使用すると
x509
モジュールを使用します。openssl x509 -req -days 360 -in server.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out server.crt
-
を使用することで
ca
モジュールを使用します。openssl ca -cert ca.crt -keyfile ca.key -in server.csr -out server.crt
注:この件に関しては、正しいパラメータの使い方がわかりません。もし使うのであれば、正しい使い方をアドバイスしてください。
認証局への証明書要求には、どのような方法で署名すべきですか? ある方法が他の方法よりも優れていますか(例えば、一方が非推奨であるなど)?
どのように解決するのですか?
1. Using the x509 module
openssl x509 ...
...
2 Using the ca module
openssl ca ...
...
それらのコマンドの前段階が抜けているのです。
これは2段階のプロセスです。まずCAを設定し、次にエンドエンティティ証明書(サーバやユーザなど)に署名します。2つのコマンドはどちらもこの2つのステップを1つにしたものです。また、どちらもCAとサーバ(エンドエンティティ)証明書の両方について、OpenSSL設定ファイルがすでにセットアップされていることを前提としています。
まず、基本的な 設定ファイル :
$ touch openssl-ca.cnf
そして、そこに以下を追加する。
HOME = .
RANDFILE = $ENV::HOME/.rnd
####################################################################
[ ca ]
default_ca = CA_default # The default ca section
[ CA_default ]
default_days = 1000 # How long to certify for
default_crl_days = 30 # How long before next CRL
default_md = sha256 # Use public key default MD
preserve = no # Keep passed DN ordering
x509_extensions = ca_extensions # The extensions to add to the cert
email_in_dn = no # Don't concat the email in the DN
copy_extensions = copy # Required to copy SANs from CSR to cert
####################################################################
[ req ]
default_bits = 4096
default_keyfile = cakey.pem
distinguished_name = ca_distinguished_name
x509_extensions = ca_extensions
string_mask = utf8only
####################################################################
[ ca_distinguished_name ]
countryName = Country Name (2 letter code)
countryName_default = US
stateOrProvinceName = State or Province Name (full name)
stateOrProvinceName_default = Maryland
localityName = Locality Name (eg, city)
localityName_default = Baltimore
organizationName = Organization Name (eg, company)
organizationName_default = Test CA, Limited
organizationalUnitName = Organizational Unit (eg, division)
organizationalUnitName_default = Server Research Department
commonName = Common Name (e.g. server FQDN or YOUR name)
commonName_default = Test CA
emailAddress = Email Address
emailAddress_default = [email protected]
####################################################################
[ ca_extensions ]
subjectKeyIdentifier = hash
authorityKeyIdentifier = keyid:always, issuer
basicConstraints = critical, CA:true
keyUsage = keyCertSign, cRLSign
上記のフィールドは、より複雑な
openssl.cnf
(にあります)。
/usr/lib/openssl.cnf
) が、CA証明書と秘密鍵を作成するための必需品だと思います。
上のフィールドはお好みでいじってください。デフォルトは、設定ファイルやコマンドのオプションを試しながら、同じ情報を入力する手間を省くことができます。
CRL関連は省略しましたが、CAの運用ではあるはずです。参照
openssl.cnf
と、関連する
crl_ext
セクションを作成します。
そして、以下を実行します。を実行します。
-nodes
は、パスワードやパスフレーズを省略することで、証明書を調べることができます。それは
本当に
悪い
は、パスワードまたはパスフレーズを省略することをお勧めします。
$ openssl req -x509 -config openssl-ca.cnf -newkey rsa:4096 -sha256 -nodes -out cacert.pem -outform PEM
コマンド実行後
cacert.pem
はCA操作のための証明書となり
cakey.pem
は秘密鍵になります。秘密鍵を思い出してください
はしません。
は、パスワードやパスフレーズを持っています。
で証明書をダンプすることができます。
$ openssl x509 -in cacert.pem -text -noout
Certificate:
Data:
Version: 3 (0x2)
Serial Number: 11485830970703032316 (0x9f65de69ceef2ffc)
Signature Algorithm: sha256WithRSAEncryption
Issuer: C=US, ST=MD, L=Baltimore, CN=Test CA/[email protected]
Validity
Not Before: Jan 24 14:24:11 2014 GMT
Not After : Feb 23 14:24:11 2014 GMT
Subject: C=US, ST=MD, L=Baltimore, CN=Test CA/[email protected]
Subject Public Key Info:
Public Key Algorithm: rsaEncryption
Public-Key: (4096 bit)
Modulus:
00:b1:7f:29:be:78:02:b8:56:54:2d:2c:ec:ff:6d:
...
39:f9:1e:52:cb:8e:bf:8b:9e:a6:93:e1:22:09:8b:
59:05:9f
Exponent: 65537 (0x10001)
X509v3 extensions:
X509v3 Subject Key Identifier:
4A:9A:F3:10:9E:D7:CF:54:79:DE:46:75:7A:B0:D0:C1:0F:CF:C1:8A
X509v3 Authority Key Identifier:
keyid:4A:9A:F3:10:9E:D7:CF:54:79:DE:46:75:7A:B0:D0:C1:0F:CF:C1:8A
X509v3 Basic Constraints: critical
CA:TRUE
X509v3 Key Usage:
Certificate Sign, CRL Sign
Signature Algorithm: sha256WithRSAEncryption
4a:6f:1f:ac:fd:fb:1e:a4:6d:08:eb:f5:af:f6:1e:48:a5:c7:
...
cd:c6:ac:30:f9:15:83:41:c1:d1:20:fa:85:e7:4f:35:8f:b5:
38:ff:fd:55:68:2c:3e:37
そして、その目的を次のようにテストしてください。
Any Purpose: Yes
をご覧ください。
"critical,CA:FALSE"ではなく、"Any Purpose CA : Yes"
).
$ openssl x509 -purpose -in cacert.pem -inform PEM
Certificate purposes:
SSL client : No
SSL client CA : Yes
SSL server : No
SSL server CA : Yes
Netscape SSL server : No
Netscape SSL server CA : Yes
S/MIME signing : No
S/MIME signing CA : Yes
S/MIME encryption : No
S/MIME encryption CA : Yes
CRL signing : Yes
CRL signing CA : Yes
Any Purpose : Yes
Any Purpose CA : Yes
OCSP helper : Yes
OCSP helper CA : Yes
Time Stamp signing : No
Time Stamp signing CA : Yes
-----BEGIN CERTIFICATE-----
MIIFpTCCA42gAwIBAgIJAJ9l3mnO7y/8MA0GCSqGSIb3DQEBCwUAMGExCzAJBgNV
...
aQUtFrV4hpmJUaQZ7ySr/RjCb4KYkQpTkOtKJOU1Ic3GrDD5FYNBwdEg+oXnTzWP
tTj//VVoLD43
-----END CERTIFICATE-----
その2として、もうひとつ、消化しやすい設定ファイルを作ってみます。まず
touch
その
openssl-server.cnf
(ユーザー証明書用にもこのようなものを作ることができます)。
$ touch openssl-server.cnf
そして、それを開いて、以下を追加します。
HOME = .
RANDFILE = $ENV::HOME/.rnd
####################################################################
[ req ]
default_bits = 2048
default_keyfile = serverkey.pem
distinguished_name = server_distinguished_name
req_extensions = server_req_extensions
string_mask = utf8only
####################################################################
[ server_distinguished_name ]
countryName = Country Name (2 letter code)
countryName_default = US
stateOrProvinceName = State or Province Name (full name)
stateOrProvinceName_default = MD
localityName = Locality Name (eg, city)
localityName_default = Baltimore
organizationName = Organization Name (eg, company)
organizationName_default = Test Server, Limited
commonName = Common Name (e.g. server FQDN or YOUR name)
commonName_default = Test Server
emailAddress = Email Address
emailAddress_default = [email protected]
####################################################################
[ server_req_extensions ]
subjectKeyIdentifier = hash
basicConstraints = CA:FALSE
keyUsage = digitalSignature, keyEncipherment
subjectAltName = @alternate_names
nsComment = "OpenSSL Generated Certificate"
####################################################################
[ alternate_names ]
DNS.1 = example.com
DNS.2 = www.example.com
DNS.3 = mail.example.com
DNS.4 = ftp.example.com
もし開発を行っていて、ワークステーションをサーバーとして使用する必要がある場合、Chromeの場合は以下のようにする必要があるかもしれません。その他
Chromeは
一般名
が無効であること (
ERR_CERT_COMMON_NAME_INVALID
)
. この例ではSANのIPアドレスとCNの関係がよくわかりません。
# IPv4 localhost
IP.1 = 127.0.0.1
# IPv6 localhost
IP.2 = ::1
次に、サーバー証明書要求を作成します。必ず
省略
-x509
*. 追加する
-x509
は証明書を作成し、リクエストは作成しません。
$ openssl req -config openssl-server.cnf -newkey rsa:2048 -sha256 -nodes -out servercert.csr -outform PEM
このコマンドが実行された後、リクエストは
servercert.csr
に、秘密鍵は
serverkey.pem
.
そして、もう一度検査することができます。
$ openssl req -text -noout -verify -in servercert.csr
Certificate:
verify OK
Certificate Request:
Version: 0 (0x0)
Subject: C=US, ST=MD, L=Baltimore, CN=Test Server/[email protected]
Subject Public Key Info:
Public Key Algorithm: rsaEncryption
Public-Key: (2048 bit)
Modulus:
00:ce:3d:58:7f:a0:59:92:aa:7c:a0:82:dc:c9:6d:
...
f9:5e:0c:ba:84:eb:27:0d:d9:e7:22:5d:fe:e5:51:
86:e1
Exponent: 65537 (0x10001)
Attributes:
Requested Extensions:
X509v3 Subject Key Identifier:
1F:09:EF:79:9A:73:36:C1:80:52:60:2D:03:53:C7:B6:BD:63:3B:61
X509v3 Basic Constraints:
CA:FALSE
X509v3 Key Usage:
Digital Signature, Key Encipherment
X509v3 Subject Alternative Name:
DNS:example.com, DNS:www.example.com, DNS:mail.example.com, DNS:ftp.example.com
Netscape Comment:
OpenSSL Generated Certificate
Signature Algorithm: sha256WithRSAEncryption
6d:e8:d3:85:b3:88:d4:1a:80:9e:67:0d:37:46:db:4d:9a:81:
...
76:6a:22:0a:41:45:1f:e2:d6:e4:8f:a1:ca:de:e5:69:98:88:
a9:63:d0:a7
次に、CAで署名する必要があります。
CAによるサーバー証明書への署名はほぼ完了です。CAの
openssl-ca.cnf
コマンドを発行する前に、あと2つのセクションが必要です。
まず
openssl-ca.cnf
を追加し、以下の2つのセクションを追加してください。
####################################################################
[ signing_policy ]
countryName = optional
stateOrProvinceName = optional
localityName = optional
organizationName = optional
organizationalUnitName = optional
commonName = supplied
emailAddress = optional
####################################################################
[ signing_req ]
subjectKeyIdentifier = hash
authorityKeyIdentifier = keyid,issuer
basicConstraints = CA:FALSE
keyUsage = digitalSignature, keyEncipherment
次に、以下を
[ CA_default ]
セクションの
openssl-ca.cnf
. 先ほどは、ややこしくなるので省きましたが(当時は未使用でした)。今、あなたはそれらがどのように使用されているかを見ることができますので、うまくいけば、彼らは意味をなさないでしょう。
base_dir = .
certificate = $base_dir/cacert.pem # The CA certifcate
private_key = $base_dir/cakey.pem # The CA private key
new_certs_dir = $base_dir # Location for new certs after signing
database = $base_dir/index.txt # Database index file
serial = $base_dir/serial.txt # The current serial number
unique_subject = no # Set to 'no' to allow creation of
# several certificates with same subject.
第三に、タッチ
index.txt
と
serial.txt
:
$ touch index.txt
$ echo '01' > serial.txt
次に、以下を実行します。
$ openssl ca -config openssl-ca.cnf -policy signing_policy -extensions signing_req -out servercert.pem -infiles servercert.csr
以下のように表示されるはずです。
Using configuration from openssl-ca.cnf
Check that the request matches the signature
Signature ok
The Subject's Distinguished Name is as follows
countryName :PRINTABLE:'US'
stateOrProvinceName :ASN.1 12:'MD'
localityName :ASN.1 12:'Baltimore'
commonName :ASN.1 12:'Test CA'
emailAddress :IA5STRING:'[email protected]'
Certificate is to be certified until Oct 20 16:12:39 2016 GMT (1000 days)
Sign the certificate? [y/n]:Y
1 out of 1 certificate requests certified, commit? [y/n]Y
Write out database with 1 new entries
Data Base Updated
コマンドが実行されると、新しく作成されたサーバ証明書が
servercert.pem
. 秘密鍵は先に作成され
serverkey.pem
.
最後に、以下のようにして、できたての証明書を検査することができます。
$ openssl x509 -in servercert.pem -text -noout
Certificate:
Data:
Version: 3 (0x2)
Serial Number: 9 (0x9)
Signature Algorithm: sha256WithRSAEncryption
Issuer: C=US, ST=MD, L=Baltimore, CN=Test CA/[email protected]
Validity
Not Before: Jan 24 19:07:36 2014 GMT
Not After : Oct 20 19:07:36 2016 GMT
Subject: C=US, ST=MD, L=Baltimore, CN=Test Server
Subject Public Key Info:
Public Key Algorithm: rsaEncryption
Public-Key: (2048 bit)
Modulus:
00:ce:3d:58:7f:a0:59:92:aa:7c:a0:82:dc:c9:6d:
...
f9:5e:0c:ba:84:eb:27:0d:d9:e7:22:5d:fe:e5:51:
86:e1
Exponent: 65537 (0x10001)
X509v3 extensions:
X509v3 Subject Key Identifier:
1F:09:EF:79:9A:73:36:C1:80:52:60:2D:03:53:C7:B6:BD:63:3B:61
X509v3 Authority Key Identifier:
keyid:42:15:F2:CA:9C:B1:BB:F5:4C:2C:66:27:DA:6D:2E:5F:BA:0F:C5:9E
X509v3 Basic Constraints:
CA:FALSE
X509v3 Key Usage:
Digital Signature, Key Encipherment
X509v3 Subject Alternative Name:
DNS:example.com, DNS:www.example.com, DNS:mail.example.com, DNS:ftp.example.com
Netscape Comment:
OpenSSL Generated Certificate
Signature Algorithm: sha256WithRSAEncryption
b1:40:f6:34:f4:38:c8:57:d4:b6:08:f7:e2:71:12:6b:0e:4a:
...
45:71:06:a9:86:b6:0f:6d:8d:e1:c5:97:8d:fd:59:43:e9:3c:
56:a5:eb:c8:7e:9f:6b:7a
先ほど、以下のように
CA_default
:
copy_extensions = copy
. このコピーは、リクエストをする人によって提供された拡張子です。
を省略した場合
copy_extensions = copy
のようなサブジェクト代替名(SAN)を持たないサーバ証明書となります。
www.example.com
と
mail.example.com
.
を使用する場合
copy_extensions = copy
しかし、リクエストに目を通さない場合、リクエスト送信者はあなたを騙して、(サーバ証明書やユーザ証明書ではなく) サボーディネートルートのようなものに署名させることができるかもしれません。つまり、彼/彼女は、あなたの信頼されたルートにチェーンする証明書を鋳造することができるようになります。リクエストは必ず
openssl req -verify
に署名してください。
もし、あなたが
省略
unique_subject
に設定するか
yes
のみを作成することができます。
1
証明書を発行します。
unique_subject = yes # Set to 'no' to allow creation of
# several ctificates with same subject.
実験中に2枚目の証明書を作成しようとすると、CAの秘密鍵でサーバーの証明書に署名する際に以下のような結果になります。
Sign the certificate? [y/n]:Y
failed to update database
TXT_DB error number 2
だから
unique_subject = no
はテストに最適です。
を確保したい場合は 組織名(Organizational Name は自己署名CA間で一貫しています。 下位CA と エンドエンティティ 証明書を取得した後、CA設定ファイルに以下を追加してください。
[ policy_match ]
organizationName = match
を許可したい場合は 組織名(Organizational Name を変更する場合は、使用します。
[ policy_match ]
organizationName = supplied
X.509/PKIX証明書におけるDNS名の取り扱いについては、他にもルールがあります。ルールについては、これらのドキュメントを参照してください。
- RFC5280に準拠。 インターネット X.509 公開鍵基盤証明書および CRL (Certificate Revocation List) プロファイル
- RFC 6125に準拠。 トランスポートレイヤーセキュリティ(TLS)のコンテキストでX.509(PKIX)証明書を使用するインターネット公開鍵基盤内のドメインベースのアプリケーションサービスIDの表現と検証
- RFC6797、付録A。 HTTP Strict Transport Security (HSTS)
- RFC 7469に準拠。 HTTP用公開鍵Pinning拡張機能
- CA/ブラウザフォーラム ベースライン要件
- CA/ブラウザフォーラム 拡張バリデーションガイドライン
RFC6797とRFC7469は、他のRFCやCA/B文書よりも制約が多いので、リストアップしました。RFCの6797と7469 しない は、IPアドレスも許可しています。
関連
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] curlです。(35) error:1408F10B:SSLルーチン:ssl3_get_record:バージョン番号が間違っている
-
[解決済み] 自己署名入りSSL証明書が無効 - "サブジェクトの代替名がありません".
-
[解決済み] NET::ERR_SSL_OBSOLETE_VERSIONとChromeの関係
-
[解決済み] pem、crt、keyファイルの違いについて
-
[解決済み] OpenSSLを使用して自己署名入りSSL証明書を生成する方法を教えてください。
-
[解決済み】自己署名証明書を持つWindowsでgitを使用して「unable to get local issuer certificate」を解決できない。
-
[解決済み】windows10にOpenSSLをインストールする方法は?
-
[解決済み】認証局でCertificate Signing Requestに署名する方法は?