2013/05/04

namecheapで購入したWildcardSSL証明書をOpenLDAPにインストールしてみた

これまで389ポートで運用してきたESXi 5.1上のOpenLDAPサーバにSSL証明書を適用してみました。

実際のところnamecheapは関係なくて、SSL証明書をどこで購入したのかは問題ではなくて、root CAや中間CA証明書の有無などが問題だったりします。

今回利用する証明書の構成や、対象サーバの環境は以下の通りです。

  • OS: Ubuntu 12.04 LTS 64bit版
  • SSL root CA Issuer: C=SE, O=AddTrust AB, OU=AddTrust External TTP Network, CN=AddTrust External CA Root
  • SSL Issuer: C=GB, ST=Greater Manchester, L=Salford, O=COMODO CA Limited, CN=PositiveSSL CA 2

最近は4階層のSSL証明書も普通にありますが、PositiveSSLの中間CA証明書は1つだけの3階層です。 4階層はテストしていませんが、c_rehashコマンドでハッシュファイルへのシンボリックリンクを作成するところを外さなければ、問題なく扱えるはずです。

ファイルの準備

SSL関連の操作ではファイル名は任意なのですが、扱うファイルの数は多い傾向があります。

まぎらわしいので参考のためにリストにしておきます。

  • WildcardSSL.crt: CN=*.example.com(Subject: OU=Domain Control Validated, OU=PositiveSSL Wildcard, CN=*.example.com)
  • PositiveSSLCA2.crt: 証明書 (Subject: C=GB, ST=Greater Manchester, L=Salford, O=COMODO CA Limited, CN=PositiveSSL CA 2)
  • AddTrustExternalCARoot.crt: CA証明書 (Subject: C=SE, O=AddTrust AB, OU=AddTrust External TTP Network, CN=AddTrust External CA Root)
  • newkey.nopass.pem: パスワードで保護されていないWildcardSSL.crtに対応する鍵ファイル
  • rootca.crt: PositiveSSLCA2.crt + AddTrustExternalCARoot.crtの2つのファイルが連結された単一CA証明書ファイル

*.crtファイルの内容は全て-----BEGIN CERTIFICATE-----で始まるので紛らわしいかと思います。 以下のコマンドで-inオプションの引数にファイルを指定すると中身を確認することができるので便利です。

$ openssl x509 -text -noout -in <cert filename>
Certificate:
    Data:
        Version: 3 (0x2)
        Serial Number:
            6f:c7:b2:c6:af:e4:cc:a6:d3:61:4b:1f:6d:56:be:fd
    Signature Algorithm: sha1WithRSAEncryption
        Issuer: C=GB, ST=Greater Manchester, L=Salford, O=COMODO CA Limited, CN=PositiveSSL CA 2
        Validity
            Not Before: Dec 13 00:00:00 2012 GMT
            Not After : Dec 13 23:59:59 2014 GMT
...

newkey.nopass.pemファイルは-----BEGIN RSA PRIVATE KEY-----で始まるファイルで、パスワードで保護されていない形式です。

パスワードを外す方法はnewkey.pemがパスワードで保護された鍵ファイルだとして、$ openssl rsa < newkey.pem > newkey.nopass.pemのような要領で作成する事ができます。

ファイルの配置

準備したファイルをOpenLDAPサーバ上に配置していきます。

今回はUbuntuなのでシステムで準備している/etc/ssl/certs, /etc/ssl/privateがありますが、クライアント認証をするわけでもなくシステムデフォルトと一線を引いて管理するためにファイルの配置場所は別に準備します。

$ sudo mkdir -p /opt/openldap/ssl
$ sudo cp WildcardSSL.crt /opt/openldap/ssl
$ cat PositiveSSLCA2.crt AddTrustExternalCARoot.crt | sudo tee /opt/openldap/ssl/rootca.crt
$ sudo c_rehash /opt/openldap/ssl/
$ sudo chgrp openldap /opt/openldap/
$ sudo chmod 750 /opt/openldap/

ESXiサーバのシェルの場合などはc_rehashコマンドが準備されていない事もありますが、手動でのリンク管理は面倒なので利用しています。

うまくいくと、次のような内容の/etc/openldap/sslディレクトリが作成できてるはずです。

sudo $ sudo ls -l /opt/openldap/ssl
lrwxrwxrwx 1 root root   22 May  4 18:35 459f9267.0 -> WildcardSSL.crt
lrwxrwxrwx 1 root root   10 May  4 18:35 5f852f3e.0 -> rootca.crt
lrwxrwxrwx 1 root root   10 May  4 18:35 ed207a3e.0 -> rootca.crt
lrwxrwxrwx 1 root root   22 May  4 18:35 f8a2c70e.0 -> WildcardSSL.crt
-rw-r--r-- 1 root root 1679 May  4 18:27 newkey.nopass.pem
-rw-r--r-- 1 root root 3278 May  4 18:34 rootca.crt
-rw-r--r-- 1 root root 1801 May  4 18:09 WildcardSSL.crt

設定ファイルの変更

必要なファイルを配置したら、Openldapの設定ファイルの変更です。

Ubuntu 12.04 LTSでのopenldapの設定ファイルは/etc/ldap/slapd.d以下でLDAP管理となっています。 そのためファイルを編集するという分けにはいきません。

設定方法は、help.ubuntu.comのOpenLDAP TLS設定方法のページに詳しく掲載されています。

このページに書かれているように、LDIFファイル(/tmp/modify.tls.ldif)を作成してldapmodifyコマンドで実行していきます。

/tmp/modify.tls.ldifファイルの内容

dn: cn=config
add: olcTLSCACertificateFile
olcTLSCACertificateFile: /opt/openldap/ssl/rootca.crt
-
add: olcTLSCertificateFile
olcTLSCertificateFile: /opt/openldap/ssl/WildcardSSL.crt
-
add: olcTLSCertificateKeyFile
olcTLSCertificateKeyFile: /opt/openldap/ssl/newkey.nopass.pem
$ sudo ldapmodify -Y EXTERNAL -H ldapi:/// -f /tmp/modify.tls.ldif
/etc/default/slapdの編集

slapdがサポートするプロトコルを指定する行に、ldaps:///を追加します。

/etc/default/slapdの変更個所抜粋

...
SLAPD_SERVICES="ldap:/// ldaps:/// ldapi:///"
...
APPARMOR対応

標準となっている/etc/ssl/ディレクトリ以下にアクセスする事がapparmorによって拒否されるため、今回はディレクトリを/etc/apparmor.d/local/usr.sbin.slapdに追加しました。

/etc/apparmor.d/local/usr.sbin.slapdファイルの内容

# Site-specific additions and overrides for usr.sbin.slapd.
# For more details, please see /etc/apparmor.d/local/README.

/opt/openldap/ r,
/opt/openldap/** r,

dh_apparmorパッケージをインストールしたのですが、うまく動かないのでシステム全体を再起動します。

$ sudo /sbin/shutdown -r now

稼働確認

ポートの確認

netstatで636ポートが開いている事を確認します。

$ netstat -nl | egrep '389|636' 
tcp        0      0 0.0.0.0:636             0.0.0.0:*               LISTEN     
tcp        0      0 0.0.0.0:389             0.0.0.0:*               LISTEN     
tcp6       0      0 :::636                  :::*                    LISTEN     
tcp6       0      0 :::389                  :::*                    LISTEN
ldapsによるクエリの実行

実際のクエリはDNなどを含むので、slapdumpなどでディレクトリの構造を把握しておく事が必要です。

$ openldap -x -H ldaps://openldap.example.com:636/ -b uid=user01,ou=People,dc=example,dc=com

もしホスト名をopenldap.example.comではなくlocalhostのように指定した場合には、SSLのCommonName(CN)に指定されているホスト名(*.example.com)との対応が取れずにエラーとなります。

$ ldapsearch -x -H ldaps://localhost:636/ -b uid=user01,ou=People,dc=example,dc=com
ldap_sasl_bind(SIMPLE): Can't contact LDAP server (-1)

localhostの部分をlocalhost.example.comのようにCNと対応するFQDNにすれば、正常に稼働します。

$ ldapsearch -x -H ldaps://localhost.example.com:636/ -b uid=user01,ou=People,dc=example,dc=com
# extended LDIF
#
# LDAPv3
...

まとめ

WildcardSSL証明書はけっこう便利です。 PDFファイルの署名にも論理的には使えますが、CA情報が登録されていないので適切な署名とはみてもらえません。

SSL接続時に警告が出るのはマルウェアなどでサイト誘導されているという認識を持たないと、まったく意味がないのですが、残念ながら世間では、この悪い常識が闊歩しているところもあります。

仕事など、責任を伴なう場面では、積極的にSSL化を勧めて環境を整備しましょう。

0 件のコメント: