end0tknr's kipple - web写経開発

太宰府天満宮の狛犬って、妙にカワイイ

amazon linux2 + apache2.4 + openssl による オレオレ クライアント認証

amazon linux2 + apache2.4 + letsencrypt による ssl化 - end0tknr's kipple - web写経開発

上記entryの続き? として、

クライアント証明書認証の設定メモ(Apache2.4 + CentOS) | あぱーブログ

を、写経(≒コピペ)しています。

認証用 html の作成

今回、https://apache.end0tknr.com/private/ 以下に対し、 クライアント認証化しますので、mkdir と index.html作成を行います。

$ sudo mkdir /var/www/html/private
$ sudo vi /var/www/html/private/index.html

private認証局 作成

まず、openssl.cnf の変更と、serial の作成を行います。

$ sudo vi /etc/pki/tls/openssl.cnf

[ usr_cert ]
old) basicConstraints=CA:FALSE
new) basicConstraints=CA:TRUE
 
[ v3_ca ]
old) # nsCertType = sslCA, emailCA
new) nsCertType = sslCA, emailCA
$ sudo vi /etc/pki/CA/serial
00

その上で、private認証局を作成します。

$ sudo /etc/pki/tls/misc/CA -newca

CA certificate filename (or enter to create)
  :
Enter PEM pass phrase: 【ないしょ、≠null】
Verifying - Enter PEM pass phrase: 【ないしょ、≠null】
(略)
Country Name (2 letter code) [XX]: JP
State or Province Name (full name) []: Tokyo
Locality Name (eg, city) [Default City]:【ないしょ、≠null】
Organization Name (eg, company) [Default Company Ltd]: end0tknr.com
Organizational Unit Name (eg, section) []: sales
Common Name (eg, your name or your server's hostname) []: end0tknr.com
Email Address []: 【ないしょ、≠null】
 
Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:
Using configuration from /etc/pki/tls/openssl.cnf
Enter pass phrase for /etc/pki/CA/private/./cakey.pem: 【ないしょ、≠null】
Check that the request matches the signature
Signature ok

最後に chmod して、この部分は完了です。

$ sudo chmod 400 /etc/pki/CA/private/cakey.pem

client証明書の発行

まず、先程、変更した /etc/pki/tls/openssl.cnf を再び変更します。

$ sudo vi /etc/pki/tls/openssl.cnf

[ usr_cert ]
old) basicConstraints=CA:TRUE
new) basicConstraints=CA:FALSE

old) # nsCertType = client, email, objsign
new) nsCertType = client, email, objsign

[ v3_ca ]
old) nsCertType = sslCA, emailCA
new) # nsCertType = sslCA, emailCA

次に、mkdir や、秘密鍵/発行要求(CSR)作成を行います。

$ sudo su -
# mkdir /etc/pki/tls/client
# cd /etc/pki/tls/client/

# sudo openssl genrsa -out client.key 2048

# sudo openssl req -new -key client.key -out client.csr

Country Name (2 letter code) [XX]: JP
State or Province Name (full name) []: Tokyo
Locality Name (eg, city) [Default City]:【ないしょ、≠null】
Organization Name (eg, company) [Default Company Ltd]: end0tknr.com
Organizational Unit Name (eg, section) []: sales
Common Name (eg, your name or your server's hostname) []: client.end0tknr.com
Email Address []:【ないしょ、≠null】
 
Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []: NULL
An optional company name []: NULL

その上で、client証明書発行と、pkcs12形式への変換を行います。

(pkcs12では、証明書と秘密鍵が1つのファイルに存在します)

# openssl ca -in client.csr -out client.crt
# openssl pkcs12 -export -in client.crt -inkey client.key -out client.p12

こまでの操作により、以下の証明書が作成されますので、ブラウザへ、installして下さい。

尚、私の場合、firefoxの設定から、installしました。

/etc/pki/tls/client/client.p12

apache 2.4 の設定変更

ssl.conf を以下のように変更すると、/private 以下のみclient認証されます。

尚、今回は、オレオレ証明書を使用している為、「SSLVerifyDepth 1」としていますが、 正式なCAを使用する場合、「SSLVerifyDepth 10」のようにするのかと思います。

$ sudo vi /etc/httpd/conf.d/ssl.conf

old) #SSLCACertificateFile /etc/pki/tls/certs/ca-bundle.crt
new) SSLCACertificateFile /etc/pki/CA/cacert.pem

#以下を追加

<Location /private>
SSLVerifyClient require
SSLVerifyDepth  1

SSLRequire ( %{SSL_CLIENT_S_DN_C}  eq "JP" and \
             %{SSL_CLIENT_S_DN_ST} eq "Tokyo" and \
             %{SSL_CLIENT_S_DN_O} in {"end0tknr.com"} \
            or %{REMOTE_ADDR} =~ m/^192\.168.+$/ )
</Location>