2007/02/15

NTP認証: ntp-keygenコマンドとX.509証明書

NTP認証シリーズの第三回。今回は、公開鍵認証に入る前の準備篇。

NTP認証: ユニキャスト・共通鍵認証篇』で既に紹介済みだが、ntpパッケージには、ntp-keygenというコマンドが付属している。このコマンドで、NTPの認証に使用する共通鍵や公開鍵・証明書を生成することができる。基本的な使い方は簡単で、引数なしで起動すれば、公開鍵・証明書を生成してくれる。オプションとして-Mオプションをつければ、共通鍵も生成する。共通鍵ファイルについては、『NTP認証: ユニキャスト・共通鍵認証篇』で述べた通りだ。

では、このコマンドで生成された公開鍵・証明書はどうなっているのか、というのが今回のテーマだ。おさらいとして、公開鍵・証明書を生成するところからやってみよう。
# dd if=/dev/urandom of=/root/.rnd bs=1024 count=1
1+0 records in
1+0 records out
1024 bytes (1.0 kB) copied, 0.240445 seconds, 4.3 kB/s
# ntp-keygen
Using OpenSSL version 90801f
Random seed file /root/.rnd 1024 bytes
Generating RSA keys (512 bits)...
RSA 0 40 46     1 11 24                         3 1 2
Generating new host file and link
ntpkey_host_ホスト名->ntpkey_RSAkey_ホスト名.3380508833
Using host key as sign key
Generating certificate RSA-MD5
X509v3 Basic Constraints: critical,CA:TRUE
X509v3 Key Usage: digitalSignature,keyCertSign
Generating new cert file and link
ntpkey_cert_ホスト名->ntpkey_RSA-MD5cert_ホスト名.3380508833
#
最初のddコマンドは、ntp-keygenコマンド実行前に/root/.rndがない場合、エラーになるのを避けるためだ。

メッセージを見ると、RSA 512bitの鍵を生成してる。今時512bitでもなかろうに、とも思わなくもないが、NTPプロトコル上の制限なのか…。

実際に生成されたファイルを確かめてみよう。
# cd /etc/ntp
# ls -F
keys
ntpkey_RSA-MD5cert_ホスト名.3380508833
ntpkey_RSAkey_ホスト名.3380508833
ntpkey_cert_ホスト名@
ntpkey_host_ホスト名@
ntpservers
step-tickers
# cat ntpkey_RSAkey_ホスト名.3380508833
# ntpkey_RSAkey_ホスト名.3380508833
# Thu Feb 15 15:13:53 2007
-----BEGIN RSA PRIVATE KEY-----
Proc-Type: 4,ENCRYPTED
DEK-Info: DES-CBC,389C92663ECF5DB9

wrSy9Q++1KwQ13Day9uY8TlvpYweLEjHmLtd0YiJFFvdNahQMRru4Zc+YL+o4VZk
<<略>>
RiARMG0NVXvkBwpVIIykS5GhGVEjqbT9+ckvZ8C0q3E=
-----END RSA PRIVATE KEY-----
#
むむ?パスワードを指定した覚えはないが…ソースコードを当たってみると、-p パスワードオプションが指定されなかった場合は、gethostname()で得られるホスト名が使われるようだ。実際にそうなっているか、openssl rsaコマンドを使って確認してみよう。
# openssl rsa -text -noout < ホスト名.3380508833
Enter pass phrase: ← ホスト名を入力
Private-Key: (512 bit)
modulus:
00:e2:7c:35:92:2a:de:15:18:1d:98:97:9c:5f:74:
f6:4f:9b:e9:c7:0a:4a:db:2e:15:fc:6c:00:f6:8c:
<<略>>
06:7b
#
確かにRSA 512bitになっている。

証明書を確認してみよう。
# cat ntpkey_RSA-MD5cert_ホスト名.3380508833
# ntpkey_RSA-MD5cert_ホスト名.3380508833
# Thu Feb 15 15:13:53 2007
-----BEGIN CERTIFICATE-----
MIIBSzCB9qADAgECAgTJfnihMA0GCSqGSIb3DQEBBAUAMB0xGzAZBgNVBAMTEmlu
YXp1bWEuZGVzdHJveWVyczAeFw0wNzAyMTUwNjEzNTNaFw0wODAyMTUwNjEzNTNa
MB0xGzAZBgNVBAMTEmluYXp1bWEuZGVzdHJveWVyczBaMA0GCSqGSIb3DQEBAQUA
A0kAMEYCQQDifDWSKt4VGB2Yl5xfdPZPm+nHCkrbLhX8bAD2jP//XaEh9g11C++l
/xPXAxA4Q+88ehQq840V2wgq8o6pgznbAgEDoyAwHjAPBgNVHRMBAf8EBTADAQH/
MAsGA1UdDwQEAwIChDANBgkqhkiG9w0BAQQFAANBANaYyZ0ZUCd+fYt9DbuNMmVb
T/pcR2rD2s7QuI2tJVa3ebmal/dz3nAPlfEadm35pQSAmjIpB0ebbOef1+EcqSA=
-----END CERTIFICATE-----
# openssl x509 -text -noout -in ntpkey_RSA-MD5cert_ホスト名.3380508833
Certificate:
Data:
Version: 3 (0x2)
Serial Number: -914458463 (-0x3681875f)
Signature Algorithm: md5WithRSAEncryption
Issuer: CN=ホスト名
Validity
Not Before: Feb 15 06:13:53 2007 GMT
Not After : Feb 15 06:13:53 2008 GMT
Subject: CN=ホスト名
Subject Public Key Info:
Public Key Algorithm: rsaEncryption
RSA Public Key: (512 bit)
Modulus (512 bit):
00:e2:7c:35:92:2a:de:15:18:1d:98:97:9c:5f:74:
f6:4f:9b:e9:c7:0a:4a:db:2e:15:fc:6c:00:f6:8c:
ff:ff:5d:a1:21:f6:0d:75:0b:ef:a5:ff:13:d7:03:
10:38:43:ef:3c:7a:14:2a:f3:8d:15:db:08:2a:f2:
8e:a9:83:39:db
Exponent: 3 (0x3)
X509v3 extensions:
X509v3 Basic Constraints: critical
CA:TRUE
X509v3 Key Usage:
Digital Signature, Certificate Sign
Signature Algorithm: md5WithRSAEncryption
d6:98:c9:9d:19:50:27:7e:7d:8b:7d:0d:bb:8d:32:65:5b:4f:
fa:5c:47:6a:c3:da:ce:d0:b8:8d:ad:25:56:b7:79:b9:9a:97:
f7:73:de:70:0f:95:f1:1a:76:6d:f9:a5:04:80:9a:32:29:07:
47:9b:6c:e7:9f:d7:e1:1c:a9:20
#
極々シンプルな自己署名証明書になっている。有効期限は一年間だ。シリアル番号がランダマイズされているのは偉い…のか、管理するのが面倒だったからなのか(笑)。仕様的には問題ないはずだが、負のシリアル番号は初めて見た。

自己署名なので、当然IssuerとSubjectが同一になっている。マニュアルによれば、これはそれぞれ、-s-iオプションで変更できることになっている。

-i name
Set the suject name to name. This is used as the subject field in certificates and in the file name for host and sign keys.
-s name
Set the issuer name to name. This is used for the issuer field in certificates and in the file name for identity files.
しかし、オプションの名前から考えて、これは逆なんじゃなかろうか?実際に確かめてみよう。
# rm *.3380508833
rm: remove 通常ファイル `ntpkey_RSA-MD5cert_ホスト名.3380508833'? y
rm: remove 通常ファイル `ntpkey_RSAkey_ホスト名.3380508833'? y
# ntp-keygen -i "subject.localnet" -s "issuer.localnet"
Using OpenSSL version 90801f
Random seed file /root/.rnd 1024 bytes
Generating RSA keys (512 bits)...
RSA 0 12 19     1 11 24                         3 1 2
Generating new host file and link
ntpkey_host_issuer.localnet->ntpkey_RSAkey_issuer.localnet.3380513148
Using host key as sign key
Generating certificate RSA-MD5
X509v3 Basic Constraints: critical,CA:TRUE
X509v3 Key Usage: digitalSignature,keyCertSign
Generating new cert file and link
ntpkey_cert_issuer.localnet->ntpkey_RSA-MD5cert_issuer.localnet.3380513148
# ls
keys                                           ntpkey_host_ホスト名
ntpkey_RSA-MD5cert_issuer.localnet.3380513148  ntpkey_host_issuer.localnet
ntpkey_RSAkey_issuer.localnet.3380513148       ntpservers
ntpkey_cert_ホスト名                 step-tickers
ntpkey_cert_issuer.localnet
# openssl x509 -text -noout -in ntpkey_RSA-MD5cert_issuer.localnet.3380513148
Certificate:
Data:
Version: 3 (0x2)
Serial Number: -914454148 (-0x36817684)
Signature Algorithm: md5WithRSAEncryption
Issuer: CN=subject.localnet
Validity
Not Before: Feb 15 07:25:48 2007 GMT
Not After : Feb 15 07:25:48 2008 GMT
Subject: CN=issuer.localnet
Subject Public Key Info:
Public Key Algorithm: rsaEncryption
RSA Public Key: (512 bit)
Modulus (512 bit):
00:c5:c8:2d:6a:95:05:1e:7f:76:b3:7e:7a:f7:5b:
85:ff:00:76:b1:fe:32:62:d4:fe:41:9a:da:05:2f:
04:0f:f9:0b:97:b7:b7:0b:90:72:ba:9e:42:de:0a:
d5:d8:3d:83:c2:e3:7d:b0:84:a4:56:ac:bf:f5:f0:
c3:9e:6a:2e:11
Exponent: 3 (0x3)
X509v3 extensions:
X509v3 Basic Constraints: critical
CA:TRUE
X509v3 Key Usage:
Digital Signature, Certificate Sign
Signature Algorithm: md5WithRSAEncryption
16:a5:2b:bb:19:8e:79:e2:08:6d:f8:76:ed:99:db:f8:ed:22:
46:af:90:67:62:c5:cb:09:c7:03:e8:ea:1f:21:c0:90:3d:08:
db:60:69:7c:e6:8e:47:5b:6a:9f:e9:e0:96:04:f7:a8:e7:d5:
08:eb:c3:53:67:6f:29:7f:40:9d
#
思った通り逆になっている。ファイル名はどうなるのかと思ったら、すべてに対して-sで指定したもの(issuer.localnet)が使われている。まあ、Issuerと言えば認証局(Certificate Authority, CA)のことで、CAは複数subjectに対して複数の証明書を発行するということを考えれば、ファイル名にIssuerの名前でなく、Subjectの名前が使われるのが自然だろう。そうでなければ、証明書のファイル名が衝突してしまうからだ。

しかし、自己署名証明書のIssuerとSubjectが違うってのはどうだろう(笑)?

第一回:『NTP認証: ユニキャスト・共通鍵認証篇
第二回:『NTP認証: ブロードキャスト・共通鍵認証篇
第三回:『NTP認証: ntp-keygenコマンドとX.509証明書
第四回:『NTP認証: ユニキャスト・公開鍵認証篇
第五回:『NTP認証: マルチキャスト・共通鍵認証篇

0 件のコメント: