@znz blog

ZnZ の memo のようなもの

OpenSSL/GnuTLS での CSR の作り方

| Comments

サーバー証明書を発行してもらう時などに毎回調べつつ 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
1
2
$ certtool --generate-privkey --outfile example-tls.key
Generating a 2432 bit RSA private key...
gnutls
1
2
$ 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
1
2
3
4
5
6
7
$ 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
1
2
3
4
5
6
7
$ 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
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
$ 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
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
$ 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 では CSTO にデフォルト値が入っていて、 対話的に作成しつつ空欄にしたい時は 別途 openssl.cnf を用意する必要がありそうです。

openssl
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
$ 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 で指定する方法が多いようですが、 対話的にも作成できました。 SubjectCN だけにするのは OpenSSL より簡単に出来たのですが、 Requested Extensions が設定されるようなので、 不要な場合には困りそうです。

gnutls
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
$ 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
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
$ 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
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
$ 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-----

Comments