coLinux日記

coLinuxはフリーソフトを種として、よろずのシステムとぞなれりける。

OpenSSLについて その4

2007-02-10 23:05:19 | OpenSSL
前回わかったことから、openssl ca コマンド実行時に /etc/pki/tls/openssl.cnf をいちいち修正することにしました。

CA証明書を作るときは、[ usr_cert ] セクションに
basicConstraints = CA:true
nsCertType = sslCA, emailCA
keyUsage = cRLSign, keyCertSign

サーバ証明書を作るときは、[ usr_cert ] セクションに
basicConstraints = CA:FALSE
nsCertType = server,client,email

を指定してみました。keyUsage を指定したのは、公式な CA の証明書 RSA Security Inc - RSA Security 1024 v3 などからの類推です。作成したCA証明書 cacert.der を FireFox にインポートしてみると、インポート時の「証明書を表示」では、

「原因不明の問題により、この証明書の有効性を検証できませんでした。」

と表示されてしまいますが、無視して「OK」でインポートしてしまってから、「証明書マネージャ」ウィンドウの「認証局証明」で、fedora.example.co.jp を選択して、「表示」で「証明書ビューア」ウィンドウが開いたら、「一般」で、

この証明書は以下の用途に使用する証明書であると検証されました。
SSL認証局

のように表示されて、うまく?いきました。FireFox で該当ページを見て、サーバの証明書を「証明書ビューア」で確認すると、

この証明書は以下の用途に使用する証明書であると検証されました。
SSL クライアント証明書
SSL サーバ証明書

「詳細」で見ると、Certificate Basic Constraints は、

Not Critical
Is not a Certificate Authority

と表示されます。つまり、FireFox 2.0.0.1 においては、

CA証明書の場合は、basicConstraints = CA:true と指定すれば、
「この証明書は以下の用途に使用する証明書であると検証されました。」となり、
nsCertType = sslCA ?が、「SSL 認証局」と認識され、

サーバの証明書の場合は、basicConstraints = CA:FALSE でも同じく「検証され」、
nsCertType = client, server ?なら、「SSL クライアント証明書」「SSL サーバ証明書」と認識

されるようです。ちなみに、現時点の Yahoo のログイン画面のものを参考にすると、
Certificate Basic Constraints
     Not Critical
     Is not a Certificate Authority
Certificate Key Usage
     Not Critical
     Signing
     Key Encipheriment
SSL サーバ証明書

ですから、ちょっとあいまいですが、
basicConstraints = CA:FALSE
nsCertType : なし
keyUsage = codeSigning(?), KeyEncipherment

でしょうか。まねすると nsCertType = server でよさそうです。

以上まとめると、OpenSSL 0.9.8 以降の自己署名型のCAを使って Apache httpd 2.2.4 で ssl を利用するためには、
openssl.cnf を以下のように修正します。openssl用作業ディレクトリです。
  dir = /usr/local/CA 

・CA.sh を以下のように修正します。これで今いるディレクトリに証明書等が生成されます。
    CATOP=.

・自己署名型のCAの証明書を作ります。
  まず openssl.cnf の [ usr_cert ] セクションで、次の指定を有効にします。
      basicConstraints=CA:true
      nsCertType = sslCA, emailCA
      keyUsage = cRLSign, KeyCertSign

  cd /usr/local/CA 
    CA.sh -newca

・サーバ証明書のためのCSRを作ります。
  まず openssl.cnf の [ usr_cert ] セクションで、次の指定を有効にします。    
      basicConstraints = CA:FALSE
      nsCertType = server

  CA.sh -newreq

・サーバのCSRをCAで署名して証明書を作ります。
    CA.sh -sign

・サーバの秘密鍵のパスフレーズを解除します。
  openssl rsa -in newkey.pem -out nopass.key

・サーバの証明書とサーバの鍵を Apache httpd の指定する場所に置きます。
  サーバの証明書 newcert.pem , サーバの鍵 nopass.key です。
    cp  newcert.pem /usr/local/httpd/conf/server.crt
    cp  nopass.key /usr/local/httpd/conf/server.key

・すべての鍵は、chmod 0600 .. で、他人に見えないようにします。

・CA の証明書を der フォーマットに変換します。
    cd /usr/local/CA
    openssl x509 -in cacert.pem -outform DER -out cacert.der

・関係者に、cacert.der を配布して、各ブラウザにインポートします。

という感じでしょうか。CA.sh と openssl の対応付けは、以前にご紹介したとおりです。将来サーバ証明書でうまくいかなかったら、openssl.cnf で keyUsage を指定してみることにします。

keyUsage は、digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment, keyAgreement,
keyCertSign, cRLSign, encipherOnly, decipherOnly, serverAuth, clientAuth,
codeSigning, emailProtection, timeStamping, msCodeInd, msCodeCom, msCTLSign,
msSGC, msEFS, nsSGC

が指定できるらしいですが、いま分かっている対応関係は以下のとおりです。

cRLSign == CRL Signer
KeyCertSign == Certificate Signer

別に今までの作業をすべて coLinux で行ったからではないのですが、とても疲れました。次回にクライアン認証を試して、とりあえず OpenSSL は終わりにしたいです。
コメント (1)
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする