2020/1/26
ユーザ | サーバ管理者 | メモ |
1.ユーザが秘密鍵・公開鍵ペアをつくる。 2.秘密鍵はユーザが大事に保管する。 3.ユーザは公開鍵をもとに証明書(クライアント証明書)を作る。 | (待機) | |
4.ユーザはクライアント証明書をサーバーに提出する。 | (待機) | 正規のユーザが提出した証明書であることを確認する。 |
(待機) | 5.クライアント認証局(オレオレサーバー)がクライアント証明書に署名する。 | |
(待機) | 6.サーバ証明書とクライアント証明書(署名済)をクライアントに届ける。 | サーバ証明書はすべてのユーザに共通 クライアント証明書(署名済)はユーザを確認する。 |
7.ユーザはサーバ証明書とクライアント証明書(署名済)をwebブラウザにインストールする。 |
修正前 | 修正後 |
default_days = 365 | default_days = 3650 |
countryName_default = XX | countryName_default = JP |
#stateOrProvinceName_default = Default Province | stateOrProvinceName_default = HKD |
localityName_default = Default City | localityName_default = HKDT |
0.organizationName_default = Default Company Ltd | 0.organizationName_default = NITH |
#organizationalUnitName_default = | organizationalUnitName_default =Takahashi Lab |
修正前 | 修正後 |
サーバ証明書に関する設定(設定済) | |
#DocumentRoot "/var/www/html" #ServerName www.example.com:443 |
#を削除, ServerNameを修正 DocumentRoot "/var/www/html" ServerName webserver.takahashi.lab:443 |
#SSLProtocol all -SSLv3 |
#を削除, プロトコルはTLS1.3のみを許可 (-allで全て不許可した後、TLS1.3を許可) #SSLProtocol -all +TLS1.3 #「SSLProtocol: Illegal protocol 'TLS1.3'」のときは #を削除 SSLProtocol all -SSLv3 |
SSLCertificateFile /etc/pki/tls/certs/localhost.crt |
#PEMでエンコードした証明書 SSLCertificateFile /etc/httpd/conf/ssl.crt/server.crt |
SSLCertificateKeyFile /etc/pki/tls/private/localhost.key |
#秘密鍵 SSLCertificateKeyFile /etc/httpd/conf/ssl.key/server.key |
<FilesMatch "\.(cgi|shtml|phtml|php)$">> SSLOptions +StdEnvVars </FilesMatch> <Directory "/var/www/cgi-bin"> SSLOptions +StdEnvVars </Directory> |
#cgi,php他は使わないのですべてコメントアウト #<FilesMatch "\.(cgi|shtml|phtml|php)$">> # SSLOptions +StdEnvVars #</FilesMatch> #<Directory "/var/www/cgi-bin"> # SSLOptions +StdEnvVars #</Directory> |
クライアント認証に関する設定(ここから修正部分) | |
#SSLCACertificateFile /etc/pki/tls/certs/ca-bundle.crt |
#client-ca.crtはこれからつくる SSLCACertificateFile /etc/httpd/conf/CA/client-ca.crt |
#SSLVerifyClient require #SSLVerifyDepth 10 | #SSLVerifyClient require(クライアント証明書が必須) #クライアント証明書はなくても可とするのでrequireをoptionalにする SSLVerifyClient optional #ルート認証局-中間認証局-..-クライアント証明書 は10階層まで探す #SSLVerifyDepth 10 #オレオレ認証局なら1でよい SSLVerifyDepth 1 |
<Location /> #SSLRequire ( %{SSL_CIPHER} !~ m/^(EXP|NULL)/ \ # and %{SSL_CLIENT_S_DN_O} eq "Snake Oil, Ltd." \ # and %{SSL_CLIENT_S_DN_OU} in {"Staff", "CA", "Dev"} \ # and %{TIME_WDAY} >= 1 and %{TIME_WDAY} <= 5 \ # and %{TIME_HOUR} >= 8 and %{TIME_HOUR} <= 20 ) \ # or %{REMOTE_ADDR} =~ m/^192\.76\.162\.[0-9]+$/ </Location> | #アクセス制御は組織名(O)がNITHで CNが"foo"か"bar" または 特定のIPアドレス <Location /> #subject=C = JP, ST = HKD, L = HKDT, O = NITH, OU = Takahashi Lab, CN = foo #subject OがNITHで CNがfooかbarならOK SSLRequire ( %{SSL_CLIENT_S_DN_O} eq "NITH" \ and %{SSL_CLIENT_S_DN_CN} in { "foo", "bar"} \ ) or \ %{REMOTE_ADDR} =~ m/^192\.168\.xx\.xx/ #192.168.xx.xxはクライアント証明書なしにアクセスできる </Location> |
#ユーザ(foo)ごとにディレクトリを作る mkdir -p client/foo;cd client/foo #秘密鍵生成 秘密鍵はfooだけが知っている openssl genrsa -out client.key 2048 #openssl genrsa 2048 > server.key #クライアントCSR生成 オプションをつけて質問を省略 または デフォルト値(openssl.cnf)を使う openssl req -new -key client.key -subj "/C=JP/ST=HKD/L=HKDT/O=NITH/OU=Takahashi Lab/CN=foo" -out client.csr #デフォルト値を使うときは-subjオプションを省略 #openssl req -new -key client.key -out client.csr #Country Name (2 letter code) [JP]: --JP,HKD,NITH,Takahashi Labはopenssl.cnfに記述したデフォルト値 #State or Province Name (full name) [HKD]: #Locality Name (eg, city) [HKDT]: #Organization Name (eg, company) [NITH]: #Organizational Unit Name (eg, section) [Takahashi Lab]: #Common Name (eg, your name or your server's hostname) []:foo ---ここは手入力 #Email Address []:. ---.(ピリオド)を指定 #A challenge password []: --そのままEnter #An optional company name []: --そのままEnter #クライアント認証局client-ca.crtをつくる openssl x509 -in client.csr -out client-ca.crt -req -signkey client.key -days 3650 #Signature ok #subject=C = JP, ST = HKD, L = HKDT, O = NITH, OU = Takahashi Lab, CN = foo #Getting Private key #秘密鍵と証明書(公開鍵証明書)をパックしてクライアント証明書にする pkcs12形式で出力 openssl pkcs12 -export -inkey client.key -in client-ca.crt -out client.p12 -name "myMember" #Enter Export Password: --このパスワードは、クライアントPCにクライアント証明書をインポートする際に必要となる #Verifying - Enter Export Password: #ここまでの作業で client-ca.crt client.csr client.key client.p12 ができる同様にユーザbarについて作業をする。
#ユーザが1人(foo)のときはコピーでよい #cp /etc/pki/foo/client-ca.crt /etc/httpd/conf/CA/client-ca.crt #ユーザ(foo,bar)が複数いるので、crtを連結する。 cat /etc/pki/client/foo/client-ca.crt /etc/pki/client/bar/client-ca.crt > /etc/httpd/conf/CA/client-ca.crt
#httpdの設定を確認 apache configtest #問題がなければ、httpdを再起動 systemctl restart httpd
サーバ証明書 | /etc/pki/myCA/server.crt |
クライアント証明書 秘密鍵・公開鍵を含む | /etc/pki/xxx/client.p12 |
パスワード | クライアント証明書をつくる際に入力したパスワード |