これについてはネット上にチュートリアルがありますが、たまたま以前に行った記録があります。必要以上に多くの情報が含まれていますが、独自の CA とそれから署名された証明書を作成する基本を達成する方法を示します。以下に貼り付けた私の記録は、CA を作成し、CA によって署名された中間 CA を作成し、最後にサーバーで使用できる証明書を作成します。明らかに中間 CA は必要ないため、中間部分をスキップして、中間 CA ではなくルート CA で最終 / 終了証明書に署名する必要があります。たとえば、end.crtを作成するときは、.. /inter_ca/inter.key 、 ../root_ca/rootca.keyなどを使用します。
ここで正しい質問をしていて、自己署名証明書が本当に必要なものであると仮定しています。
証明書とキーの作成後、Apache の構成に関するガイダンスと、OpenSSL ツールを使用して正しく動作していることを確認する方法の説明もあります (任意の SSL TCP 接続で、Cowboy やその他のものにも適用できます)。 )。これにより、信頼チェーンが表示されますが、中間 CA を省略するため、深さ 2 ではなく深さ 1 になります。
操作するディレクトリをいくつか作成します。
mkdir inter_ca_demo
cd inter_ca_demo
mkdir root_ca inter_ca end_cert
cd root_ca
キーを作成します。
openssl genrsa -out rootca.key 2048
出力は次のようになります。
Generating RSA private key, 2048 bit long modulus
...........................................................+++
.............................+++
e is 65537 (0x10001)
自己署名してルート CA 証明書を作成します (証明書にエンコードされるさまざまな情報を入力する必要があります)。
openssl req -x509 -new -nodes -key rootca.key -days 1024 -out rootca.pem
次のようになります (ここで入力内容を確認できます)。
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [AU]:GB
State or Province Name (full name) [Some-State]:London
Locality Name (eg, city) []:London
Organization Name (eg, company) [Internet Widgits Pty Ltd]:Method Analysis Ltd
Organizational Unit Name (eg, section) []:
Common Name (e.g. server FQDN or YOUR name) []:methodanalysis.com
Email Address []:ca_admin@methodanalysis.com
中間証明書に進む前に、ルート証明書の名前を変更するか、コピーするか、ルート証明書へのリンクを作成して、ハッシュ アルゴリズムで見つけられるようにする必要があります。これは、CA パスに信頼できる証明書が多数ある場合にパフォーマンスが低下しないようにするためです。これを行うには、次のコマンドを使用してハッシュが何であるかを調べる必要があります。
openssl x509 -noout -hash -in rootca.pem
出力は次のようになります。
03ed4e37
次に、リンクを作成し、YOUR HASHに.0を追加します (前のコマンドからの出力として):
ln -s rootca.pem 03ed4e37.0
次に、中間 CA キーと CSR (証明書署名要求) を作成します (証明書にエンコードされるさまざまな情報を入力する必要があります)。
cd ../inter_ca
openssl genrsa -out inter.key 2048
openssl req -new -key inter.key -out inter.csr
次のようになります。
$ openssl genrsa -out inter.key 2048
Generating RSA private key, 2048 bit long modulus
.........................................+++
..............................................................+++
e is 65537 (0x10001)
$ openssl req -new -key inter.key -out inter.csr
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [AU]:GB
State or Province Name (full name) [Some-State]:London
Locality Name (eg, city) []:London
Organization Name (eg, company) [Internet Widgits Pty Ltd]:Intermediate certificates R US Ltd
Organizational Unit Name (eg, section) []:
Common Name (e.g. server FQDN or YOUR name) []:intermediatecasrus.com
Email Address []:ca_admin@intermediatecasrus.com
Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:
ここで、これが中間 CA であることを示すデータを含むファイル (v3x509extensions.txt) を作成し、ルート CA で署名して中間証明書を生成します。
echo 'basicConstraints=CA:TRUE' > v3x509extensions.txt
openssl x509 -req -extfile v3x509extensions.txt -in inter.csr -CA ../root_ca/rootca.pem -CAkey ../root_ca/rootca.key -CAcreateserial -out inter.crt -days 200
次のようになります。
Signature ok
subject=/C=GB/ST=London/L=London/O=Intermediate certificates R US Ltd/CN=intermediatecasrus.com/emailAddress=ca_admin@intermediatecasrus.com
Getting CA Private Key
次に、最終的なキー (SSL Web サイト (たとえば) に使用するキー) を作成し、そこから CSR を作成し、中間証明書で署名して、新しい証明書を生成します。
cd ../end_cert
openssl genrsa -out end.key 2048
openssl req -new -key end.key -out end.csr
openssl x509 -req -in end.csr -CA ../inter_ca/inter.crt -CAkey ../inter_ca/inter.key -CAcreateserial -out end.crt -days 500
次のようになります。
$ openssl genrsa -out end.key 2048
Generating RSA private key, 2048 bit long modulus
................................................+++
.....................................................+++
e is 65537 (0x10001)
$ openssl req -new -key end.key -out end.csr
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [AU]:GB
State or Province Name (full name) [Some-State]:London
Locality Name (eg, city) []:London
Organization Name (eg, company) [Internet Widgits Pty Ltd]:End User Ltd
Organizational Unit Name (eg, section) []:
Common Name (e.g. server FQDN or YOUR name) []:intermediatecademo-enduser.com
Email Address []:support@intermediatecademo-enduser.com
Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:
$ openssl x509 -req -in end.csr -CA ../inter_ca/inter.crt -CAkey ../inter_ca/inter.key -CAcreateserial -out end.crt -days 500
Signature ok
subject=/C=GB/ST=London/L=London/O=End User Ltd/CN=intermediatecademo-enduser.com/emailAddress=support@intermediatecademo-enduser.com
Getting CA Private Key
この時点で、信頼チェーンを検証することで、問題がないように見えることを確認できます。ここでは、中間証明書と「エンド」証明書を連結し、ルート CA パスのみを使用してそれらを検証します (「エンド」証明書は検証できないことに注意してください)。中間 CA がないため、「エンド」証明書で指定する必要があります):
cat ../inter_ca/inter.crt end.crt | openssl verify -CApath ../root_ca
出力は次のようになります。
stdin: OK
たとえば、これらのキーを apache で使用した場合、次のように構成できます。
SSLCertificateFile FULL_PATH_TO/inter_ca_demo/end_cert/end.crt
SSLCertificateKeyFile FULL_PATH_TO/inter_ca_demo/end_cert/end.key
SSLCertificateChainFile FULL_PATH_TO/inter_ca_demo/inter_ca/inter.crt
SSLCACertificatePath FULL_PATH_TO/inter_ca_demo/root_ca
Apache は独自の証明書とともに中間証明書を提供するようになりました。これにより、Web クライアントは「openssl verify」を使用して上記と同じ種類の検証を (他のチェックと共に) 実行できます。
これらの証明書を apache で使用し、作成した「エンド」証明書に合わせて「intermediatecademo-enduser.com」という名前の Web サイトを作成した場合は、openssl を使用して、クライアントの観点から証明書を検証することもできます。
openssl s_client -connect intermediatecademo-enduser.com:443 -CApath root_ca -verify 5
出力は次のようになります。
verify depth is 5
CONNECTED(00000004)
depth=2 C = GB, ST = London, L = London, O = Method Analysis Ltd, CN = methodanalysis.com, emailAddress = ca_admin@methodanalysis.com
verify return:1
depth=1 C = GB, ST = London, L = London, O = Intermediate certificates R US Ltd, CN = intermediatecasrus.com, emailAddress = ca_admin@intermediatecasrus.com
verify return:1
depth=0 C = GB, ST = London, L = London, O = End User Ltd, CN = intermediatecademo-enduser.com, emailAddress = support@intermediatecademo-enduser.com
verify return:1
---
Certificate chain
0 s:/C=GB/ST=London/L=London/O=End User Ltd/CN=intermediatecademo-enduser.com/emailAddress=support@intermediatecademo-enduser.com
i:/C=GB/ST=London/L=London/O=Intermediate certificates R US Ltd/CN=intermediatecasrus.com/emailAddress=ca_admin@intermediatecasrus.com
1 s:/C=GB/ST=London/L=London/O=Intermediate certificates R US Ltd/CN=intermediatecasrus.com/emailAddress=ca_admin@intermediatecasrus.com
i:/C=GB/ST=London/L=London/O=Method Analysis Ltd/CN=methodanalysis.com/emailAddress=ca_admin@methodanalysis.com
---
Server certificate
...
...
...
Start Time: 1445696823
Timeout : 300 (sec)
Verify return code: 0 (ok)
---
データが送信されるのを待ってハングします。CTRL+C で終了できます。