OpenSSLで作成した鍵をSSHの公開鍵認証に使う  

SSHの公開鍵認証を行う際には新規にキーペアを作ることが多いと思いますが、下記で説明するOpenSSLで作成した個人証明書をSSHの公開鍵認証に使う方法をメモしておきます。SSHのキーペアを作成する際にも使用するssh-keygenを使います。
秘密鍵newkey.pemを元に作成します。
オプション-yで秘密鍵からauthorized_keys用の公開鍵文字列を作成できます。コマンドは以下の通り。

% ssh-keygen -y -f newkey.pem
Enter passphrase:(秘密鍵のパスフレーズ)
ssh-rsa AAAA....

というようなssh-rsaに続く文字列が出力されます。これをauthorized_keysに追加すれば、newkey.pemを用いて公開鍵認証を行うことが可能です。追加する場合は以下のような感じ。

% ssh-keygen -y -f newkey.pem >> /home/dobuo/.ssh/authorized_keys

なおnewkey.pemを使う時はid_rsaとして保存しておきます。

% cp newkey.pem /home/dobuo/.ssh/id_rsa
% chmod 600 /home/dobuo/.ssh/id_rsa

よく忘れること  

なお、authorized_keysを新規作成した場合はパーミッションを600にセットしておかないと、

Authentication refused: bad ownership or modes for file /home/dobuo/.ssh/authorized_keys

と怒られて認証が失敗します。(secureログに出力されるので一般ユーザーだと気付かないかも・・・)

OpenSSLによる証明書作成等の作業  

ネット上を探せばOpenSSL関係の解説を数多く見つけることはできますが、自分用にちょっとメモしておきます。

環境設定  

この解説では作業を全て一般ユーザーで行います。ここではユーザー名をdobuo、ホームディレクトリを/home/dobuoとして進めます。
まずは環境設定を行います。証明書作業を行うディレクトリを/home/dobuo/certs以下とします。

ディレクトリの作成と設定ファイルのコピー  

% mkdir /home/dobuo/certs
% cp /usr/share/ssl/misc/openssl.cnf /home/dobuo/cert  <-- 設定ファイルのコピー。CentOSでは/etc/pki/tls/openssl.cnfをコピー

環境変数の設定  

スクリプトにパスを通しますが、ディストリビューションにより場所が異なるようです。Vineでは/usr/share/ssl/misc、CentOSでは/etc/pki/tls/miscです。

bashの場合
export PATH=/usr/share/ssl/misc:$PATH
export CATOP=$HOME/certs/BioKidsCA               <-- CAディレクトリ名前は任意
export SSLEAY_CONFIG="-config $HOME/certs/openssl.cnf" <-- 使用する設定ファイルを指定
tcshの場合
setenv PATH /usr/share/ssl/misc:$PATH
setenv CATOP $HOME/certs/BioKidsCA
setenv SSLEAY_CONFIG="-config $HOME/certs/openssl.cnf"

openssl.cnfの修正  

ディフォルト値などの状況に合わせて修正します。/home/dobuo/certs/openssl.cnfを修正を行います。修正のポイントは以下。

  1. CAディレクトリの場所 必須 35行目付近のdirパラメータ
    37: #dir            = ./demoCA              # Where everything is kept
    38: dir             = $ENV::CATOP           # Where everything is kept <-- 環境変数CATOPを参照する
  1. 鍵長を2048bitsにする 101行目付近のdefault_bitsパラメータ
    101: [ req ]
    102: #default_bits           = 1024
    103: default_bits            = 2048

プライベート認証局の構築  

設定ができたら、まずはプライベート認証局(CA)を構築します。

入力項目について  

入力項目はサイトのポリシーにあわせればいいと思いますが、ここでは国名(C)、組織名(O)、部局名(OU)を入力しました。もちろんCommon Name(CN)は必須です。それ以降の部分は空でも問題ないでしょう。
ただし、ディフォルトのopenssl.cnfではState or Provine Name(ST)が必須になっているので、不要な場合は以下の部分を修正します。

78: # For the CA policy
79: [ policy_match ]
80: countryName             = match    <-- matchはCA署名の際に確認されるためめ入力項目として必要
81: stateOrProvinceName     = match
82: organizationName        = match
83: organizationalUnitName  = optional <-- optionalは署名の際なくてもよい
84: commonName              = supplied <-- CSRで指定される
85: emailAddress            = optional

この部分のstateOrProvinceNameをoptionalに変更することでSTを外すことができます。
なお、初期値等は以下の部分で指定します。

125: [ req_distinguished_name ]
126: countryName                     = Country Name (2 letter code)
127: countryName_default             = JP
128: countryName_min                 = 2
129: countryName_max                 = 2
130:
131: stateOrProvinceName             = State or Province Name (full name)
132: #stateOrProvinceName_default    = Some-State

この部分のstateOrProvinceName_defaultなどの項目を変更すれば初期値が変わります。不要の場合はコメントアウトしておきます。

構築作業  

設定が済んだら作業に入ります。作業はCAシェルスクリプトを用いて行います。ディストリビューションによって場所が異なると思われますが、Vine 5では/usr/share/ssl/misc/CA、CentOS 5では/etc/pki/tls/misc/CAです。環境設定でパスが通っているはずです。

% CA -newca
CA certificate filename (or enter to create)
(何も入力せずにEnter)
Making CA certificate ...
Generating a 2048 bit RSA private key
.............+++
.....+++
writing new private key to '/home/nobrin/certs/BioKidsCA/private/./cakey.pem'
Enter PEM pass phrase: (秘密鍵のパスフレーズを設定)
Verifying - Enter PEM pass phrase: (確認のため再入力)
...(省略)...
Country Name (2 letter code) [JP]: JP
State or Province Name (full name) []: (openssl.cnfで修正していない場合は入力が必要;後述)
Locality Name (eg, city) []:
Organization Name (eg, company) [BioKids]: BioKids (組織名/会社名)
Organizational Unit Name (eg, section) [BioKids Operations]: BioKids Operations (部局名)
Common Name (eg, YOUR name) []: BioKids Private CA (CAの名前)
Email Address []:

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:
...(省略)...
Write out database with 1 new entries
Data Base Updated

これで/home/dobuo/certs/BioKidsCA以下に認証局が構築されました。

証明書署名要求の作成およびCAによる署名  

CAが構築できたら、証明書の作成を行うことができます。証明書は以下のように作成されます。

  1. 申請者による証明書署名要求(CSR)の作成
  2. CAによるCSRへの署名

混乱しやすいのはCSRの作成と署名が別人格で行われるということです(作業するユーザーは同一)。CSRはその名の通り要求なので申請者がCAに対して「この内容を証明してね」という申請書の作成になり、それに対してCAが署名する、という流れです。ここでは作業するユーザーは同一なので、申請者とCAの役割を演じる「一人ごっこ遊び」と考えればいいのかもしれません。

CSRの作成(申請者)  

基本的にはCAの構築とあまり変わりません。ユーザーdobuoで行いますが、今は申請者として作業を行います。従って、この作業はCAには影響を与えません。
ここではBioKidsのBioKids Authors部門に所属するDobuo(/C=JP/O=BioKids/OU=BioKids Authors/CN=Dobuo)という設定で申請してみます。なお、上記の設定で作成したCAは国名および組織名を一致したものに署名するようになっているので、国名および組織名はCAとあわせる必要があります。

% CA -newreq
Generating a 2048 bit RSA private key
......................+++
....................+++
writing new private key to 'newkey.pem'
Enter PEM pass phrase: (作成する秘密鍵のパスフレーズ)
Verifying - Enter PEM pass phrase: (再入力)
...(省略)...
Country Name (2 letter code) [JP]:
State or Province Name (full name) []:
Locality Name (eg, city) []:
Organization Name (eg, company) [BioKids]:BioKids
Organizational Unit Name (eg, section) [BioKids Operations]:BioKids Authors
Common Name (eg, YOUR name) []:Dobuo
Email Address []:
...(省略)...
Request is in newreq.pem, private key is in newkey.pem

この作業により、秘密鍵newkey.pemおよびCSR newreq.pemが作成されます。newkey.pemは秘密鍵なので大切に保管します。署名を申請する際に必要なのはnewreq.pemです。

CSRへの署名(CAとして)  

申請者として作成したnewreq.pemがあるディレクトリで署名スクリプトを実行します。

% CA -sign
Using configuration from /home/nobrin/certs/openssl.cnf
Enter pass phrase for /home/nobrin/certs/BioKidsCA/private/cakey.pem: (CAの秘密鍵のパスフレーズ)
Check that the request matches the signature
Signature ok
Certificate Details:
        Serial Number:
            XX:XX:XX:XX:XX:XX:XX:XX
        Validity
            Not Before: Nov 23 02:14:42 2011 GMT
            Not After : Nov 22 02:14:42 2012 GMT
        Subject:
            countryName               = JP
            organizationName          = BioKids         <-- CSRに記載された組織名
            organizationalUnitName    = BioKids Authors <-- CSRに記載された部局名
            commonName                = Dobuo           <-- CSRに記載されたCommon Name
        X509v3 extensions:
            X509v3 Basic Constraints:
                CA:FALSE
            Netscape Comment:
                OpenSSL Generated Certificate

Certificate is to be certified until Nov 22 02:14:42 2012 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
Certificate:
    Data:
       ...(証明書の内容が表示される)...
-----END CERTIFICATE-----
Signed certificate is in newcert.pem

ここで作成されたnewcert.pemが証明書です。CSR作成の際に生成されたnewkey.pemとペアになります。

これらを原本として、SSHの認証やその他のクライアント認証などに使用することができます。