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を修正を行います。修正のポイントは以下。
- CAディレクトリの場所
- 鍵長
- CAディレクトリの場所 必須
35行目付近のdirパラメータ
37: #dir = ./demoCA # Where everything is kept 38: dir = $ENV::CATOP # Where everything is kept <-- 環境変数CATOPを参照する
- 鍵長を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が構築できたら、証明書の作成を行うことができます。証明書は以下のように作成されます。
- 申請者による証明書署名要求(CSR)の作成
- 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とペアになります。
- newkey.pem -- 申請者Dobuoの秘密鍵
- newcert.pem -- 申請者Dobuoの証明書
これらを原本として、SSHの認証やその他のクライアント認証などに使用することができます。