証明書を格納してみる

LDAP サーバには証明書を格納できます.

格納の方法(LDIF ファイルの書き方)が少し特殊なので書いておきます.

core.shema

core.schema を眺めてみると,それらしい属性がいくつか見つかります.

  • userCertificate
  • cACertificate
  • authorityRevocationList
  • certificateRevocationList
  • crossCertificatePair

偶然,クライアント証明書が手元にあったので,この証明書を userCertificate に指定してみます.

格納するクライアント証明書

今回使用するクライアント証明書です.

-----BEGIN CERTIFICATE-----
MIIDXzCCAkegAwIBAgIFAJ+xmTcwDQYJKoZIhvcNAQEFBQAwGTEXMBUGA1UEAwwO
Y2EuZXhhbXBsZS5jb20wHhcNMTIwMTMwMTUwMDAwWhcNMTMwMTMwMTUwMDAwWjAh
MR8wHQYDVQQDDBZoZXhhLmRpYXJ5QGV4YW1wbGUuY29tMIIBIjANBgkqhkiG9w0B
AQEFAAOCAQ8AMIIBCgKCAQEAqeo9n9jvwvZqdQiek7MwOg3YO2Ft28/vjTDD4UvD
JeGD2oOVg3C5Pg9EqHtC+HebxpYabJNRIcx3gcH/Ykooy/xaVvK2aQq+zwcZuvgU
RYRtdpmGx6otbA+LShVK0rolRYkH4MWEpN7SUrxNGUR41kYX+jbDUpp97Yp38z6h
o6thal+4hm0GvIc3a9NMBYog2aFpNuCDJCeQaLcqNRYOI9v7IXxbNolM5tmCMNTs
zIFwz8d1UZQREouSG6536joBrug/CbBhH/TthpWpVy6UrUk8MC6G/XbwMhIlafY/
uJ6Y8qkplugJiKLiaBp0NcdM2Mc+igGmDkr4b8VWlws3dwIDAQAfo4GlMIGiMAwG
A1UdEwEB/wQCMAAwHwYDVR0jBBgwFoAUW+hePyMFM8Hpn/SIi93Fs4NfPikwHQYD
VR0OBBYEFMdf5OBoGg9TxSrnfvObmjg3k8txMB0GA1UdJQQWMBQGCCsGAQUFBwMB
BggrBgEFBQcDAjAzBgNVHR8ELDAqMCigJqAkhiJodHRwOi8vZXhhbXBsZS5jb20v
Y3JsL2V4YW1wbGUuY3JsMA0GCSqGSIb3DQEBBQUAA4IBAQAyWCvNP/k1UYuoZ49d
JwlURKm6g59+6bqeUdv7EkaSgjTol0mvY7UwwHzztZsnapmGin36bWURaNZs+xrZ
7Xn/OWHB3grmKxF/eXowlmtF0EzS0Xg5n6s48n0deMkPIy8GUxD/KpQqUV+GYt5V
XdSEKdH0ovLkzoiqtISN7C49VRRm6F9MIFoFnJQMQUU3XCN0djrEuNiPZ/op4zJ1
1/Ft5UdYDB7TIWXI1+sJy1yrRWg31dRj0ThiNxBTL9zR9rHCCMLDJAZODLl6jRhg
lSyVF995MJRNui7qlJksHpDOM85H67SthInq18Jc67lyrKyJPAXuQON20ftq86Y7
ygvo
-----END CERTIFICATE-----

テキストだとこんな感じです.

Certificate:
    Data:
        Version: 3 (0x2)
        Serial Number: 2679216439 (0x9fb19937)
        Signature Algorithm: sha1WithRSAEncryption
        Issuer: CN=ca.example.com
        Validity
            Not Before: Jan 30 15:00:00 2012 GMT
            Not After : Jan 30 15:00:00 2013 GMT
        Subject: CN=hexa.diary@example.com
        Subject Public Key Info:
            Public Key Algorithm: rsaEncryption
                Public-Key: (2048 bit)
                Modulus:
                    00:a9:ea:3d:9f:d8:ef:c2:f6:6a:75:08:9e:93:b3:
                    30:3a:0d:d8:3b:61:6d:db:cf:ef:8d:30:c3:e1:4b:
                    c3:25:e1:83:da:83:95:83:70:b9:3e:0f:44:a8:7b:
                    42:f8:77:9b:c6:96:1a:6c:93:51:21:cc:77:81:c1:
                    ff:62:4a:28:cb:fc:5a:56:f2:b6:69:0a:be:cf:07:
                    19:ba:f8:14:45:84:6d:76:99:86:c7:aa:2d:6c:0f:
                    8b:4a:15:4a:d2:ba:25:45:89:07:e0:c5:84:a4:de:
                    d2:52:bc:4d:19:44:78:d6:46:17:fa:36:c3:52:9a:
                    7d:ed:8a:77:f3:3e:a1:a3:ab:61:6a:5f:b8:86:6d:
                    06:bc:87:37:6b:d3:4c:05:8a:20:d9:a1:69:36:e0:
                    83:24:27:90:68:b7:2a:35:16:0e:23:db:fb:21:7c:
                    5b:36:89:4c:e6:d9:82:30:d4:ec:cc:81:70:cf:c7:
                    75:51:94:11:12:8b:92:1b:ae:77:ea:3a:01:ae:e8:
                    3f:09:b0:61:1f:f4:ed:86:95:a9:57:2e:94:ad:49:
                    3c:30:2e:86:fd:76:f0:32:12:25:69:f6:3f:b8:9e:
                    98:f2:a9:29:96:e8:09:88:a2:e2:68:1a:74:35:c7:
                    4c:d8:c7:3e:8a:01:a6:0e:4a:f8:6f:c5:56:97:0b:
                    37:77
                Exponent: 65567 (0x1001f)
        X509v3 extensions:
            X509v3 Basic Constraints: critical
                CA:FALSE
            X509v3 Authority Key Identifier: 
                keyid:5B:E8:5E:3F:23:05:33:C1:E9:9F:F4:88:8B:DD:C5:B3:83:5F:3E:29

            X509v3 Subject Key Identifier: 
                C7:5F:E4:E0:68:1A:0F:53:C5:2A:E7:7E:F3:9B:9A:38:37:93:CB:71
            X509v3 Extended Key Usage: 
                TLS Web Server Authentication, TLS Web Client Authentication
            X509v3 CRL Distribution Points: 

                Full Name:
                  URI:http://example.com/crl/example.crl

    Signature Algorithm: sha1WithRSAEncryption
        32:58:2b:cd:3f:f9:35:51:8b:a8:67:8f:5d:27:09:54:44:a9:
        ba:83:9f:7e:e9:ba:9e:51:db:fb:12:46:92:82:34:e8:97:49:
        af:63:b5:30:c0:7c:f3:b5:9b:27:6a:99:86:8a:7d:fa:6d:65:
        11:68:d6:6c:fb:1a:d9:ed:79:ff:39:61:c1:de:0a:e6:2b:11:
        7f:79:7a:30:96:6b:45:d0:4c:d2:d1:78:39:9f:ab:38:f2:7d:
        1d:78:c9:0f:23:2f:06:53:10:ff:2a:94:2a:51:5f:86:62:de:
        55:5d:d4:84:29:d1:f4:a2:f2:e4:ce:88:aa:b4:84:8d:ec:2e:
        3d:55:14:66:e8:5f:4c:20:5a:05:9c:94:0c:41:45:37:5c:23:
        74:76:3a:c4:b8:d8:8f:67:fa:29:e3:32:75:d7:f1:6d:e5:47:
        58:0c:1e:d3:21:65:c8:d7:eb:09:cb:5c:ab:45:68:37:d5:d4:
        63:d1:38:62:37:10:53:2f:dc:d1:f6:b1:c2:08:c2:c3:24:06:
        4e:0c:b9:7a:8d:18:60:95:2c:95:17:df:79:30:94:4d:ba:2e:
        ea:94:99:2c:1e:90:ce:33:ce:47:eb:b4:ad:84:89:ea:d7:c2:
        5c:eb:b9:72:ac:ac:89:3c:05:ee:40:e3:76:d1:fb:6a:f3:a6:
        3b:ca:0b:e8


証明書は PEM 形式から,DER 形式に変換しておきます.

OpenSSL を使用する場合は,下記のようにして変換します.

# openssl x509 -inform PEM -outform DER -in client.pem -out client.der

LDIF ファイル

inetOrgPerson オブジェクトクラスを使用します.
必須の属性は cn と sn です.
必須属性が必要なのは,基底オブジェクトクラス(の基底オブジェクトクラス)が Person オブジェクトクラスだからです.

LDIF ファイルには,userCertificate にクライアント証明書のファイルを指定します.また,userCertificate: ではなく,userCertificate;binary: と記載します.

dn: cn=hexa.diary@example.com,dc=ldap,dc=example,dc=com
objectclass: inetOrgPerson
cn: hexa.diary@example.com
sn: sn
userCertificate;binary:< file:///root/client.der

cn, sn は適当に指定してます.

追加と確認

ldapadd

エントリを追加します.

# ldapadd -x -H ldaps://ldap.example.com -D 'cn=Manager,dc=ldap,dc=example,dc=com' -W -f hexa.diary.ldif 
Enter LDAP Password: 
adding new entry "cn=hexa.diary@example.com,dc=ldap,dc=example,dc=com"
ldapsearch

ldapsearch で確認してみます.

# ldapsearch -x -H ldaps://ldap.example.com -D 'cn=Manager,dc=ldap,dc=example,dc=com' -W -b 'dc=ldap,dc=example,dc=com' '(cn=hexa.diary@example.com)'
Enter LDAP Password: 
# extended LDIF
#
# LDAPv3
# base <dc=ldap,dc=example,dc=com> with scope subtree
# filter: (cn=hexa.diary@example.com)
# requesting: ALL
#

# hexa.diary@example.com, ldap.example.com
dn: cn=hexa.diary@example.com,dc=ldap,dc=example,dc=com
objectClass: inetOrgPerson
cn: hexa.diary@example.com
sn: sn
userCertificate;binary:: MIIDXzCCAkegAwIBAgIFAJ+xmTcwDQYJKoZIhvcNAQEFBQAwGTEXM
 BUGA1UEAwwOY2EuZXhhbXBsZS5jb20wHhcNMTIwMTMwMTUwMDAwWhcNMTMwMTMwMTUwMDAwWjAhMR
 8wHQYDVQQDDBZoZXhhLmRpYXJ5QGV4YW1wbGUuY29tMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMII
 BCgKCAQEAqeo9n9jvwvZqdQiek7MwOg3YO2Ft28/vjTDD4UvDJeGD2oOVg3C5Pg9EqHtC+HebxpYa
 bJNRIcx3gcH/Ykooy/xaVvK2aQq+zwcZuvgURYRtdpmGx6otbA+LShVK0rolRYkH4MWEpN7SUrxNG
 UR41kYX+jbDUpp97Yp38z6ho6thal+4hm0GvIc3a9NMBYog2aFpNuCDJCeQaLcqNRYOI9v7IXxbNo
 lM5tmCMNTszIFwz8d1UZQREouSG6536joBrug/CbBhH/TthpWpVy6UrUk8MC6G/XbwMhIlafY/uJ6
 Y8qkplugJiKLiaBp0NcdM2Mc+igGmDkr4b8VWlws3dwIDAQAfo4GlMIGiMAwGA1UdEwEB/wQCMAAw
 HwYDVR0jBBgwFoAUW+hePyMFM8Hpn/SIi93Fs4NfPikwHQYDVR0OBBYEFMdf5OBoGg9TxSrnfvObm
 jg3k8txMB0GA1UdJQQWMBQGCCsGAQUFBwMBBggrBgEFBQcDAjAzBgNVHR8ELDAqMCigJqAkhiJodH
 RwOi8vZXhhbXBsZS5jb20vY3JsL2V4YW1wbGUuY3JsMA0GCSqGSIb3DQEBBQUAA4IBAQAyWCvNP/k
 1UYuoZ49dJwlURKm6g59+6bqeUdv7EkaSgjTol0mvY7UwwHzztZsnapmGin36bWURaNZs+xrZ7Xn/
 OWHB3grmKxF/eXowlmtF0EzS0Xg5n6s48n0deMkPIy8GUxD/KpQqUV+GYt5VXdSEKdH0ovLkzoiqt
 ISN7C49VRRm6F9MIFoFnJQMQUU3XCN0djrEuNiPZ/op4zJ11/Ft5UdYDB7TIWXI1+sJy1yrRWg31d
 Rj0ThiNxBTL9zR9rHCCMLDJAZODLl6jRhglSyVF995MJRNui7qlJksHpDOM85H67SthInq18Jc67l
 yrKyJPAXuQON20ftq86Y7ygvo

# search result
search: 2
result: 0 Success

# numResponses: 2
# numEntries: 1

無事に追加されているようです.

userCertificate の確認

ついでなので,userCertificate;binary:: の内容を確認してみます.

userCertificate;binary:: の内容を client.crt ファイルに保存して,下記を実行して確認します.

$ ruby -r openssl -r base64 -e "puts OpenSSL::X509::Certificate.new(Base64::decode64(File.read('client.crt'))).to_text"
Certificate:
    Data:
        Version: 3 (0x2)
        Serial Number: 2679216439 (0x9fb19937)
        Signature Algorithm: sha1WithRSAEncryption
        Issuer: CN=ca.example.com
        Validity
            Not Before: Jan 30 15:00:00 2012 GMT
            Not After : Jan 30 15:00:00 2013 GMT
        Subject: CN=hexa.diary@example.com
        Subject Public Key Info:
            Public Key Algorithm: rsaEncryption
                Public-Key: (2048 bit)
                Modulus:
                    00:a9:ea:3d:9f:d8:ef:c2:f6:6a:75:08:9e:93:b3:
                    30:3a:0d:d8:3b:61:6d:db:cf:ef:8d:30:c3:e1:4b:
                    c3:25:e1:83:da:83:95:83:70:b9:3e:0f:44:a8:7b:
                    42:f8:77:9b:c6:96:1a:6c:93:51:21:cc:77:81:c1:
                    ff:62:4a:28:cb:fc:5a:56:f2:b6:69:0a:be:cf:07:
                    19:ba:f8:14:45:84:6d:76:99:86:c7:aa:2d:6c:0f:
                    8b:4a:15:4a:d2:ba:25:45:89:07:e0:c5:84:a4:de:
                    d2:52:bc:4d:19:44:78:d6:46:17:fa:36:c3:52:9a:
                    7d:ed:8a:77:f3:3e:a1:a3:ab:61:6a:5f:b8:86:6d:
                    06:bc:87:37:6b:d3:4c:05:8a:20:d9:a1:69:36:e0:
                    83:24:27:90:68:b7:2a:35:16:0e:23:db:fb:21:7c:
                    5b:36:89:4c:e6:d9:82:30:d4:ec:cc:81:70:cf:c7:
                    75:51:94:11:12:8b:92:1b:ae:77:ea:3a:01:ae:e8:
                    3f:09:b0:61:1f:f4:ed:86:95:a9:57:2e:94:ad:49:
                    3c:30:2e:86:fd:76:f0:32:12:25:69:f6:3f:b8:9e:
                    98:f2:a9:29:96:e8:09:88:a2:e2:68:1a:74:35:c7:
                    4c:d8:c7:3e:8a:01:a6:0e:4a:f8:6f:c5:56:97:0b:
                    37:77
                Exponent: 65567 (0x1001f)
        X509v3 extensions:
            X509v3 Basic Constraints: critical
                CA:FALSE
            X509v3 Authority Key Identifier: 
                keyid:5B:E8:5E:3F:23:05:33:C1:E9:9F:F4:88:8B:DD:C5:B3:83:5F:3E:29

            X509v3 Subject Key Identifier: 
                C7:5F:E4:E0:68:1A:0F:53:C5:2A:E7:7E:F3:9B:9A:38:37:93:CB:71
            X509v3 Extended Key Usage: 
                TLS Web Server Authentication, TLS Web Client Authentication
            X509v3 CRL Distribution Points: 

                Full Name:
                  URI:http://example.com/crl/example.crl

    Signature Algorithm: sha1WithRSAEncryption
        32:58:2b:cd:3f:f9:35:51:8b:a8:67:8f:5d:27:09:54:44:a9:
        ba:83:9f:7e:e9:ba:9e:51:db:fb:12:46:92:82:34:e8:97:49:
        af:63:b5:30:c0:7c:f3:b5:9b:27:6a:99:86:8a:7d:fa:6d:65:
        11:68:d6:6c:fb:1a:d9:ed:79:ff:39:61:c1:de:0a:e6:2b:11:
        7f:79:7a:30:96:6b:45:d0:4c:d2:d1:78:39:9f:ab:38:f2:7d:
        1d:78:c9:0f:23:2f:06:53:10:ff:2a:94:2a:51:5f:86:62:de:
        55:5d:d4:84:29:d1:f4:a2:f2:e4:ce:88:aa:b4:84:8d:ec:2e:
        3d:55:14:66:e8:5f:4c:20:5a:05:9c:94:0c:41:45:37:5c:23:
        74:76:3a:c4:b8:d8:8f:67:fa:29:e3:32:75:d7:f1:6d:e5:47:
        58:0c:1e:d3:21:65:c8:d7:eb:09:cb:5c:ab:45:68:37:d5:d4:
        63:d1:38:62:37:10:53:2f:dc:d1:f6:b1:c2:08:c2:c3:24:06:
        4e:0c:b9:7a:8d:18:60:95:2c:95:17:df:79:30:94:4d:ba:2e:
        ea:94:99:2c:1e:90:ce:33:ce:47:eb:b4:ad:84:89:ea:d7:c2:
        5c:eb:b9:72:ac:ac:89:3c:05:ee:40:e3:76:d1:fb:6a:f3:a6:
        3b:ca:0b:e8

確かに,LDIF ファイルで指定したクライアント証明書であることが確認できました.