第二回 一人 OpenLDAP 勉強会

一人勉強会動機

なんか色々勉強したいのですが、
続かないからブログで恥をかきながら勉強しようと思い立ちました。

環境

目標

OpenSSL の簡易証明局を使って証明書を作成

/etc/ssl/misc/CA.sh

./CA.sh -newca
CA certificate filename (or enter to create)

Making CA certificate ...
Generating a 1024 bit RSA private key
...........++++++
............++++++
writing new private key to './demoCA/private/./cakey.pem'
Enter PEM pass phrase:
Verifying - Enter PEM pass phrase:
-----
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]:Tokyo
Locality Name (eg, city) []:
Organization Name (eg, company) [Internet Widgits Pty Ltd]:
Organizational Unit Name (eg, section) []:
Common Name (eg, YOUR name) []:voluntas
Email Address []:

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:
Using configuration from /etc/ssl/openssl.cnf
Enter pass phrase for ./demoCA/private/./cakey.pem:
Check that the request matches the signature
Signature ok
Certificate Details:
        Serial Number: 0 (0x0)
        Validity
            Not Before: Sep 29 09:52:35 2007 GMT
            Not After : Sep 28 09:52:35 2010 GMT
        Subject:
            countryName               = JP
            stateOrProvinceName       = Tokyo
            organizationName          = Internet Widgits Pty Ltd
            commonName                = voluntas
        X509v3 extensions:
            X509v3 Basic Constraints: 
                CA:FALSE
            Netscape Comment: 
                OpenSSL Generated Certificate
            X509v3 Subject Key Identifier: 
                75:D0:43:C8:2C:59:D1:9B:F1:55:E5:4F:66:E9:C6:80:5C:9D:FA:A3
            X509v3 Authority Key Identifier: 
                keyid:75:D0:43:C8:2C:59:D1:9B:F1:55:E5:4F:66:E9:C6:80:5C:9D:FA:A3

Certificate is to be certified until Sep 28 09:52:35 2010 GMT (1095 days)

Write out database with 1 new entries
Data Base Updated
  • /demoCA/cacert.pen <- CAの証明書
  • /demoCA/private/cakey.pen <- CAの秘密鍵

LDAP サーバの証明書発行要求とプライベート鍵の作成

ここでCommon Nameには、slapdを動かすホスト名(クライアントがサーバに指定するホスト名)と一致させておく必要があるのに注意してください。これが一致しないとSSL/TLSのコネクションを確立できません。

$ mkdir -p openldap/private
$ openssl req -new -nodes -keyout private/ldapsvkey.pem -out ldapsvreq.pem
Generating a 1024 bit RSA private key
.......................................++++++
......................++++++
writing new private key to 'private/ldapsvkey.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]:JP
State or Province Name (full name) [Some-State]:Tokyo
Locality Name (eg, city) []:
Organization Name (eg, company) [Internet Widgits Pty Ltd]:
Organizational Unit Name (eg, section) []:
Common Name (eg, YOUR name) []:ldap <- ここは OpenLDAP をおいているホスト名
Email Address []:

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:
  • /ldapsvreq.pem <- 証明書発行要求
  • /private/ldapsvkey.pem <- LDAPサーバの秘密鍵

CSRへ署名した証明書を発行する

$ openssl ca -out openldap/ldapsvcert.pem -infiles openldap/ldapsvreq.pem 
Using configuration from /etc/ssl/openssl.cnf
Enter pass phrase for ./demoCA/private/cakey.pem:
Check that the request matches the signature
Signature ok
Certificate Details:
        Serial Number: 1 (0x1)
        Validity
            Not Before: Sep 29 09:56:00 2007 GMT
            Not After : Sep 28 09:56:00 2008 GMT
        Subject:
            countryName               = JP
            stateOrProvinceName       = Tokyo
            organizationName          = Internet Widgits Pty Ltd
            commonName                = ldap
        X509v3 extensions:
            X509v3 Basic Constraints: 
                CA:FALSE
            Netscape Comment: 
                OpenSSL Generated Certificate
            X509v3 Subject Key Identifier: 
                E1:42:0C:D2:99:BD:82:4E:96:95:DB:1D:AD:D2:D3:F7:CA:59:C9:C7
            X509v3 Authority Key Identifier: 
                keyid:75:D0:43:C8:2C:59:D1:9B:F1:55:E5:4F:66:E9:C6:80:5C:9D:FA:A3

Certificate is to be certified until Sep 28 09:56:00 2008 GMT (365 days)
Sign the certificate? [y/n]:y
1 out of 1 certificate requests certified, commit? [y/n]y
Write out database with 1 new entries
Data Base Updated

設定ファイル

サーバ側の証明書を設定

/etc/openldap/slapd.conf

# LDAPサーバの証明書ファイルパス
TLSCertificateFile /full/path/openldap/ldapsvcert.pem
# LDAPサーバの秘密鍵ファイルパス
TLSCertificateKeyFile /full/path/openldap/private/ldapsvkey.pem
# CAの証明書ファイルパス
TLSCACertificateFile /full/path/openldap/cacert.pem

ldapsearch する際に使用する証明書を設定

/etc/openldap/ldap.conf

# CAの証明書ファイルパス
TLSCACertificateFile /full/path/ldap/openldap/cacert.pem

ldaps を有効にする。

/etc/default/slapd

SLAPD_SERVICES="ldap://127.0.0.1:389/ ldaps:/// ldapi:///"

slapd を再起動する。 /etc/rc.d/slapd restart
ldaps で待ち受けてるかどうか確認

$ netstat -a
tcp   0   0 *:ldaps    *:*   LISTEN 
  • ldap:// はポート 389
  • ldaps:// はポート 636

検索してみる

ldap:// で検索

ldapsearch -x -H ldap://ホスト名/IP -b 'dc=example,dc=com'

ldaps:// で検索
ldapsearch -x -H ldaps://ホスト名/IP -b 'dc=example,dc=com'

デバッグ
ldapsearch -d3 -x -H ldaps://ホスト名/IP -b 'dc=example,dc=com'

通っぽい
ldapsearch -x -h ホスト名/IP -b 'dc=example,dc=com' -ZZ

これで LDAPS で検索可能となる。

LDAPS 対応完了。

はまったところ

  • LDAPサーバ証明書の cn をホスト名と一致させる必要があることに気付かなかった
  • /etc/default/slapd の場所を見つけるのに一苦労
  • --with-tls でコンパイルされていなかったぽいので、無駄にパッケージ自分で作った(意味なかった)
  • Mac のアドレスブックで ssl するときに証明書をインストールしておく必要がある?
  • keychain に証明書インストールしてもよくわからんかった。
  • Mac で MacPortsOpenLDAP を入れた場合は /opt/local/etc/openldap/ldap.conf に TLS_REQCERT allow を設定しないとオレオレ証明書を受け入れてくれないので要注意。
  • CA証明書をインストールする必要はある(あたりまえ
  • TLS certificate verification: Error, self signed certificate in certificate chain と言われたらオレオレ証明書は受け入れられないよという事。

課題&調査

  • 認証は使いましょう -> ユーザID とパスワードでいけるのかしら
  • SSL 通信にしないと不安ではある -> 証明書周りが結構大変、証明局をまず立てないとダメなあたりから敷居は高い。
  • LDIF 書くのかなりだるいのでなんとかするべき
  • 日本語の表示周り
  • Manager という名前の付け方 -> root/admin なんでもいいらしい

感想

  • あたりまえだけど OpenSSL の知識必須
  • TLS_REQCERT の設定を ldapsearch を行う側でやる必要がある
  • オレオレ証明書ではまる
  • 証明書さえ設定してしまえば簡単
  • はまりどころが結構あるので実際にやってみないとよくわからない