サーバー証明書を発行してもらう時などに毎回調べつつ CSR を作成しているので、 GnuTLS と OpenSSL を使った方法をまとめてみました。
パッケージインストール
OpenSSL の方は入っていることが多いと思いますが、入っていなければ openssl
パッケージをいれておきます。
GnuTLS の方は Debian や Ubuntu の場合は gnutls-bin
パッケージに gnutls-cli
コマンドなどが入っています。 RHEL などでは gnutls-utils
というパッケージに入っているらしいです。
certtool コマンド
certtool
コマンドは Mac OS X にもありますが、 GnuTLS のものとは別物です。 ここで説明しているのは GnuTLS の certtool
コマンドです。
秘密鍵作成
秘密鍵の生成はランダムな情報を元に生成するので、ビット数やエントロピーの量に応じて時間がかかります。 デスクトップマシンなどではマウスを動かすなどの方法でエントロピーを増やすことが出来るかもしれません。
作成されるファイルのパーミッションなどを考えると暗号化しないなら GnuTLS の certtool --generate-privkey --bits 4096 --outfile example.key
の方法がオススメです。
GnuTLS
GnuTLS の certtool
コマンドでは --generate-privkey
で秘密鍵を作成できます。 --bits
で鍵のビット数を指定しないと squeeze だと 2048 ビット、 precise や wheezy だと 2432 ビットになりました。 ファイルのパーミッションも -rw-------
(600) で作成されるので、そのまま使えます。
gnutls:
$ certtool --generate-privkey --outfile example-tls.key
Generating a 2432 bit RSA private key...
gnutls:
$ certtool --generate-privkey --bits 4096 --outfile example-tls.key
Generating a 4096 bit RSA private key...
OpenSSL
OpenSSL では genrsa
サブコマンドで生成します。 OpenSSL 1.0.0 では genpkey
サブコマンドになっているようですが、 genrsa
もまだ使えるので、以下は genrsa
だけ書いています。
ビット数を指定しないと squeeze だと 1024 ビット、 precise や wheezy だと 512 ビットになりました。 また、そのままだとパーミッションが -rw-rw-r--
(664) で生成されるので、あらかじめパーミッションを設定したファイルを用意しておいて上書きさせるか、すぐに chmod
で変更しておいた方が良さそうです。
openssl:
$ touch example-ssl.key
$ chmod 600 example-ssl.key
$ openssl genrsa -out example-ssl.key
Generating RSA private key, 512 bit long modulus
....++++++++++++
.........................++++++++++++
e is 65537 (0x10001)
openssl:
$ touch example-ssl.key
$ chmod 600 example-ssl.key
$ openssl genrsa -out example-ssl.key 4096
Generating RSA private key, 4096 bit long modulus
......................................................++
...........++
e is 65537 (0x10001)
ネット上見つかる情報では -des3
などで生成したファイルを一度暗号化して、 サーバーの起動時に不要になるようにすぐに外すような例もあるようですが、 そんなことをするぐらいなら最初から暗号化せずに生成すれば良いと思います。
暗号化した状態のファイルを別途バックアップするなどの目的があるのなら、 意味があると思いますが、 暗号化した状態のファイルを残さないのなら単なる無駄だと思います。
秘密鍵の内容確認
秘密鍵の内容を確認することはあまりないと思いますが、 openssl rsa -in example.key -text -noout
の方法がオススメです。
OpenSSL
OpenSSL で秘密鍵の内容を確認するには rsa
サブコマンドを使います。 -text
で内容全体の表示で -noout
は -----BEGIN RSA PRIVATE KEY-----
から -----END RSA PRIVATE KEY-----
を表示しないという意味です。 秘密鍵本体の前にテキストの説明がついたものも元の秘密鍵と同様に扱えるようなので、 デフォルトでは元の内容も出力するようになっているのだと思います。
openssl:
$ openssl rsa -in example-ssl.key -text -noout
Private-Key: (4096 bit)
modulus:
00:cb:35:ec:f6:00:5a:75:d7:55:14:f8:55:91:1a:
(略)
publicExponent: 65537 (0x10001)
privateExponent:
4d:86:de:47:a0:2c:e2:e6:6b:2c:5b:ed:f1:35:10:
(略)
prime1:
00:ef:49:b3:f8:4c:1e:a9:13:a9:fb:86:7e:80:7a:
(略)
prime2:
00:d9:67:2f:e1:4c:13:78:fa:dd:2b:7a:3e:f5:68:
(略)
exponent1:
00:ba:18:ee:ff:a7:6b:9d:01:2f:0c:f0:0f:88:29:
(略)
exponent2:
52:93:94:27:32:5b:4f:1f:92:74:9a:39:61:c3:ae:
(略)
coefficient:
44:e9:a2:de:87:e7:2d:f0:57:58:d6:fc:85:20:df:
(略)
GnuTLS
GnuTLS の certtool
で秘密鍵の内容を確認するには -k
(--key-info
) を使います。 openssl
の -noout
相当のオプションは見つけられませんでした。
gnutls:
$ certtool -k --infile example-tls.key
Public Key Info:
Public Key Algorithm: RSA
Key Security Level: High
modulus:
00:da:45:da:ca:13:ac:59:43:55:87:68:04:16:1a:
(略)
public exponent:
01:00:01:
private exponent:
3c:5b:18:96:cc:3d:da:28:fe:5b:84:ed:ac:56:e2:
(略)
prime1:
00:dc:f3:92:13:d5:c7:cf:bc:9f:76:b3:f6:a2:60:
(略)
prime2:
00:fc:e5:83:0e:2e:d4:a1:be:37:bf:05:6e:c3:d3:
(略)
coefficient:
63:74:e3:95:9e:d6:6c:7d:d9:2d:ad:45:f8:0b:1a:
(略)
exp1:
00:a1:1d:a7:9e:79:1c:2b:da:42:79:bf:7f:10:26:
(略)
exp2:
00:b3:be:9c:ab:53:f5:a5:10:01:a7:2f:41:4e:c5:
(略)
c4:31:
Public Key ID: 45:44:BC:C4:BB:95:24:97:5D:C2:95:BF:27:95:02:2C:50:09:9E:35
-----BEGIN RSA PRIVATE KEY-----
(略)
-----END RSA PRIVATE KEY-----
CSR 作成と内容確認
OpenSSL は openssl req
で作成も内容の確認も出来ます。 GnuTLS の certtool
は -q
(--generate-request
) で作成して --crq-info
で内容を確認できます。
以下の例ではそれぞれで作成して、両方で内容を確認しています。
OpenSSL
OpenSSL では C
と ST
と O
にデフォルト値が入っていて、 対話的に作成しつつ空欄にしたい時は 別途 openssl.cnf
を用意する必要がありそうです。
openssl:
$ openssl req -new -key example-ssl.key -out example-ssl.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]:JP
State or Province Name (full name) [Some-State]:Osaka
Locality Name (eg, city) []:
Organization Name (eg, company) [Internet Widgits Pty Ltd]:
Organizational Unit Name (eg, section) []:
Common Name (e.g. server FQDN or YOUR name) []:ssl.example.jp
Email Address []:
Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:
$ openssl req -in example-ssl.csr -text -noout
Certificate Request:
Data:
Version: 0 (0x0)
Subject: C=JP, ST=Osaka, O=Internet Widgits Pty Ltd, CN=ssl.example.jp
Subject Public Key Info:
Public Key Algorithm: rsaEncryption
Public-Key: (4096 bit)
Modulus:
00:cb:35:ec:f6:00:5a:75:d7:55:14:f8:55:91:1a:
(略)
Exponent: 65537 (0x10001)
Attributes:
a0:00
Signature Algorithm: sha1WithRSAEncryption
4f:1a:a7:57:9f:88:f3:17:23:aa:51:12:11:ff:c0:24:31:4c:
(略)
$ certtool --crq-info --infile example-ssl.csr
PKCS #10 Certificate Request Information:
Version: 1
Subject: C=JP,ST=Osaka,O=Internet Widgits Pty Ltd,CN=ssl.example.jp
Subject Public Key Algorithm: RSA
Modulus (bits 4096):
cb:35:ec:f6:00:5a:75:d7:55:14:f8:55:91:1a:9b:83
(略)
Exponent:
01:00:01
Other Information:
Public Key Id:
c14459bdb79e6b71e6303e4ffd9c7ab43dc9b9df
-----BEGIN NEW CERTIFICATE REQUEST-----
(略)
-----END NEW CERTIFICATE REQUEST-----
GnuTLS
GnuTLS ではテンプレートファイルを作成しておいて --template
で指定する方法が多いようですが、 対話的にも作成できました。 Subject
を CN
だけにするのは OpenSSL より簡単に出来たのですが、 Requested Extensions
が設定されるようなので、 不要な場合には困りそうです。
gnutls:
$ certtool -q --load-privkey example-tls.key --outfile example-tls.csr
Generating a PKCS #10 certificate request...
Country name (2 chars):
Organization name:
Organizational unit name:
Locality name:
State or province name:
Common name: tls.example.jp
UID:
Enter a dnsName of the subject of the certificate:
Enter the IP address of the subject of the certificate:
Enter the e-mail of the subject of the certificate:
Enter a challenge password:
Does the certificate belong to an authority? (y/N):
Will the certificate be used for signing (DHE and RSA-EXPORT ciphersuites)? (y/N):
Will the certificate be used for encryption (RSA ciphersuites)? (y/N):
Is this a TLS web client certificate? (y/N):
Is this also a TLS web server certificate? (y/N):
$ openssl req -in example-tls.csr -text -noout
Certificate Request:
Data:
Version: 0 (0x0)
Subject: CN=tls.example.jp
Subject Public Key Info:
Public Key Algorithm: rsaEncryption
Public-Key: (4096 bit)
Modulus:
00:da:45:da:ca:13:ac:59:43:55:87:68:04:16:1a:
(略)
Exponent: 65537 (0x10001)
Attributes:
Requested Extensions:
X509v3 Basic Constraints: critical
CA:FALSE
X509v3 Key Usage: critical
Digital Signature
Signature Algorithm: sha1WithRSAEncryption
cb:71:d2:c9:a2:97:14:74:f0:63:69:6b:36:31:ff:ce:f2:a0:
(略)
$ certtool --crq-info --infile example-tls.csr
PKCS #10 Certificate Request Information:
Version: 1
Subject: CN=tls.example.jp
Subject Public Key Algorithm: RSA
Modulus (bits 4096):
da:45:da:ca:13:ac:59:43:55:87:68:04:16:1a:09:41
(略)
Exponent:
01:00:01
Attributes:
Extensions:
Basic Constraints (critical):
Certificate Authority (CA): FALSE
Key Usage (critical):
Digital signature.
Other Information:
Public Key Id:
4544bcc4bb9524975dc295bf2795022c50099e35
-----BEGIN NEW CERTIFICATE REQUEST-----
(略)
-----END NEW CERTIFICATE REQUEST-----
まとめて作成
CSR の生成の時に秘密鍵を指定しないと、 CSR と一緒に秘密鍵を生成できるようです。
OpenSSL
openssl req -new
で -key
の代わりに -newkey
などを指定すると CSR と一緒に秘密鍵も生成できます。 この場合もそのままだとパーミッションが -rw-rw-r--
(664) になるようなので、注意が必要です。 -nodes
を付けないと暗号化するためのパスフレーズを要求されます。
openssl:
$ openssl req -new -newkey rsa:4096 -nodes -keyout server.key -out server.csr
Generating a 4096 bit RSA private key
.............................................................................................................................................................................................................................................................................................................................................++
......++
writing new private key to 'server.key'
-----
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]:JP
State or Province Name (full name) [Some-State]:Osaka
Locality Name (eg, city) []:
Organization Name (eg, company) [Internet Widgits Pty Ltd]:
Organizational Unit Name (eg, section) []:
Common Name (e.g. server FQDN or YOUR name) []:ssl.example.jp
Email Address []:
Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:
GnuTLS
certtool -q
で --load-privkey
を指定しないと秘密鍵も一緒に生成するようです。 出力は --outfile
で指定したファイルにまとめて入ってしまって、 使い勝手は良くないので、個別に生成した方が良さそうです。
gnutls:
$ certtool -q --outfile out.txt
Generating a PKCS #10 certificate request...
Generating a 2432 bit RSA private key...
Country name (2 chars):
Organization name:
Organizational unit name:
Locality name:
State or province name:
Common name: tls.example.jp
UID:
Enter a dnsName of the subject of the certificate:
Enter the IP address of the subject of the certificate:
Enter the e-mail of the subject of the certificate:
Enter a challenge password:
Does the certificate belong to an authority? (y/N):
Will the certificate be used for signing (DHE and RSA-EXPORT ciphersuites)? (y/N):
Will the certificate be used for encryption (RSA ciphersuites)? (y/N):
Is this a TLS web client certificate? (y/N):
Is this also a TLS web server certificate? (y/N):
$ cat out.txt
-----BEGIN RSA PRIVATE KEY-----
(略)
-----END RSA PRIVATE KEY-----
PKCS #10 Certificate Request Information:
Version: 1
Subject: CN=tls.example.jp
Subject Public Key Algorithm: RSA
Modulus (bits 2432):
f4:ff:66:e8:c6:19:ab:7b:39:e3:72:ff:ee:13:fa:cf
(略)
Exponent:
01:00:01
Attributes:
Extensions:
Basic Constraints (critical):
Certificate Authority (CA): FALSE
Key Usage (critical):
Digital signature.
Other Information:
Public Key Id:
61c9cef12d691e3373f71ad3a82d1ac4c4b71793
-----BEGIN NEW CERTIFICATE REQUEST-----
(略)
-----END NEW CERTIFICATE REQUEST-----