Raspberry Piの自己証明書SSL作成
自己証明書でなく無料で利用ができるLet's Encript(参考記事(Let's Encrypt導入))を利用したかったのですが、メインのWEBサーバーであるSynologyがPort80を利用しており、現時点のLet's Encrypt証明書を入手するツールにおいて、Port80以外の8080などでhttp通信を待ち受けているサイトでの簡単なSSL証明書作成および入手方法が見つかりませんでした。
手動発行やSynologyからフックさせる方法はありそうでしたが、今後の3ヶ月毎の自動更新などを考え、利用を諦めました。HTTPのポート番号指定「--http-01-port 8080」やHTTPSのポート番号指定「--tls-sni-01-port 4443」を実施しましたが、最初にポート80へのアクセスが発生しておりました。
そこで、 今回は昔ながらの自己証明書作成を実施しました。
現在運用しているシステム構成イメージ(API連携プラットフォーム)
SSL証明書作成
以下コマンド一覧です。
@raspberrypi:~ $ su - Password: root@raspberrypi:~# cd /etc/ssl/private/ root@raspberrypi:/etc/ssl/private# openssl genrsa -aes256 -out server.key 2048 root@raspberrypi:/etc/ssl/private# openssl req -new -days 3650 -key server.key -out server.csr
apacheのSSL関係の構成定義ファイルに作成した証明書を登録します。「/etc/apache2/sites-available/default-ssl.conf」
しかし、現時点で作成したSSLのサーバ証明書はパスワードが設定されているので、apacheサーバ再起動時にパスワード入力が必要となるので、パスワード不要なサーバー証明書を後程作成しなおします。
##change #SSLCertificateFile /etc/ssl/certs/ssl-cert-snakeoil.pem #SSLCertificateKeyFile /etc/ssl/private/ssl-cert-snakeoil.key ##change SSLCertificateFile /etc/ssl/private/server.crt SSLCertificateKeyFile /etc/ssl/private/server.key
以下、コマンドログです。
@raspberrypi:~ $ su - Password: Wi-Fi is currently blocked by rfkill. Use raspi-config to set the country before use. root@raspberrypi:~# cd /etc/ssl/private/ root@raspberrypi:/etc/ssl/private# openssl genrsa -aes256 -out server.key 2048 Generating RSA private key, 2048 bit long modulus (2 primes) ....................................+++++ ....................+++++ e is 65537 (0x010001) Enter pass phrase for server.key:パスワード Verifying - Enter pass phrase for server.key:パスワード root@raspberrypi:/etc/ssl/private# root@raspberrypi:/etc/ssl/private# openssl req -new -days 3650 -key server.key -out server.csr Ignoring -days; not generating a certificate Enter pass phrase for server.key:パスワード You are about to be asked to enter information that will be incorporated into your certificate request. What you are about to enter is what is called a Distinguished Name or a DN. There are quite a few fields but you can leave some blank For some fields there will be a default value, If you enter '.', the field will be left blank. ----- Country Name (2 letter code) [AU]:JP State or Province Name (full name) [Some-State]:Tokyo Locality Name (eg, city) []:Tokyo Organization Name (eg, company) [Internet Widgits Pty Ltd]:MIKI-IE Organizational Unit Name (eg, section) []:IT Common Name (e.g. server FQDN or YOUR name) []:miki-ie.com Email Address []:mail@192.168.0.108 Please enter the following 'extra' attributes to be sent with your certificate request A challenge password []:(空欄) An optional company name []:(空欄) root@raspberrypi:/etc/ssl/private# ls server.csr server.key ssl-cert-snakeoil.key root@raspberrypi:/etc/ssl/private# root@raspberrypi:/etc/ssl/private# openssl x509 -in server.csr -out server.crt -req -signkey server.key -days 3650 subject=C = JP, ST = Tokyo, L = Tokyo, O = MIKI-IE, OU = IT, CN = miki-ie.com, emailAddress = mail@192.168.0.108 Getting Private key Enter pass phrase for server.key:パスワード root@raspberrypi:/etc/ssl/private# ls server.crt server.csr server.key ssl-cert-snakeoil.key root@raspberrypi:/etc/ssl/private# root@raspberrypi:/etc/ssl/private# cd /etc/apache2/sites-available/ root@raspberrypi:/etc/apache2/sites-available# ls 000-default.conf default-ssl.conf root@raspberrypi:/etc/apache2/sites-available# vi default-ssl.conf root@raspberrypi:/etc/apache2/sites-available# cat default-ssl.conf <IfModule mod_ssl.c> <VirtualHost _default_:4443> ServerAdmin webmaster@192.168.0.108 DocumentRoot /var/www/html # Available loglevels: trace8, ..., trace1, debug, info, notice, warn, # error, crit, alert, emerg. # It is also possible to configure the loglevel for particular # modules, e.g. #LogLevel info ssl:warn ErrorLog ${APACHE_LOG_DIR}/error.log CustomLog ${APACHE_LOG_DIR}/access.log combined # For most configuration files from conf-available/, which are # enabled or disabled at a global level, it is possible to # include a line for only one particular virtual host. For example the # following line enables the CGI configuration for this host only # after it has been globally disabled with "a2disconf". #Include conf-available/serve-cgi-bin.conf # SSL Engine Switch: # Enable/Disable SSL for this virtual host. SSLEngine on # A self-signed (snakeoil) certificate can be created by installing # the ssl-cert package. See # /usr/share/doc/apache2/README.Debian.gz for more info. # If both key and certificate are stored in the same file, only the # SSLCertificateFile directive is needed. #SSLCertificateFile /etc/ssl/certs/ssl-cert-snakeoil.pem #SSLCertificateKeyFile /etc/ssl/private/ssl-cert-snakeoil.key ##miki SSLCertificateFile /etc/ssl/private/server.crt SSLCertificateKeyFile /etc/ssl/private/server.key # Server Certificate Chain: # Point SSLCertificateChainFile at a file containing the # concatenation of PEM encoded CA certificates which form the # certificate chain for the server certificate. Alternatively # the referenced file can be the same as SSLCertificateFile # when the CA certificates are directly appended to the server # certificate for convinience. #SSLCertificateChainFile /etc/apache2/ssl.crt/server-ca.crt # Certificate Authority (CA): # Set the CA certificate verification path where to find CA # certificates for client authentication or alternatively one # huge file containing all of them (file must be PEM encoded) # Note: Inside SSLCACertificatePath you need hash symlinks # to point to the certificate files. Use the provided # Makefile to update the hash symlinks after changes. #SSLCACertificatePath /etc/ssl/certs/ #SSLCACertificateFile /etc/apache2/ssl.crt/ca-bundle.crt # Certificate Revocation Lists (CRL): # Set the CA revocation path where to find CA CRLs for client # authentication or alternatively one huge file containing all # of them (file must be PEM encoded) # Note: Inside SSLCARevocationPath you need hash symlinks # to point to the certificate files. Use the provided # Makefile to update the hash symlinks after changes. #SSLCARevocationPath /etc/apache2/ssl.crl/ #SSLCARevocationFile /etc/apache2/ssl.crl/ca-bundle.crl # Client Authentication (Type): # Client certificate verification type and depth. Types are # none, optional, require and optional_no_ca. Depth is a # number which specifies how deeply to verify the certificate # issuer chain before deciding the certificate is not valid. #SSLVerifyClient require #SSLVerifyDepth 10 # SSL Engine Options: # Set various options for the SSL engine. # o FakeBasicAuth: # Translate the client X.509 into a Basic Authorisation. This means that # the standard Auth/DBMAuth methods can be used for access control. The # user name is the `one line' version of the client's X.509 certificate. # Note that no password is obtained from the user. Every entry in the user # file needs this password: `xxj31ZMTZzkVA'. # o ExportCertData: # This exports two additional environment variables: SSL_CLIENT_CERT and # SSL_SERVER_CERT. These contain the PEM-encoded certificates of the # server (always existing) and the client (only existing when client # authentication is used). This can be used to import the certificates # into CGI scripts. # o StdEnvVars: # This exports the standard SSL/TLS related `SSL_*' environment variables. # Per default this exportation is switched off for performance reasons, # because the extraction step is an expensive operation and is usually # useless for serving static content. So one usually enables the # exportation for CGI and SSI requests only. # o OptRenegotiate: # This enables optimized SSL connection renegotiation handling when SSL # directives are used in per-directory context. #SSLOptions +FakeBasicAuth +ExportCertData +StrictRequire <FilesMatch "\.(cgi|shtml|phtml|php)$"> SSLOptions +StdEnvVars </FilesMatch> <Directory /usr/lib/cgi-bin> SSLOptions +StdEnvVars </Directory> # SSL Protocol Adjustments: # The safe and default but still SSL/TLS standard compliant shutdown # approach is that mod_ssl sends the close notify alert but doesn't wait for # the close notify alert from client. When you need a different shutdown # approach you can use one of the following variables: # o ssl-unclean-shutdown: # This forces an unclean shutdown when the connection is closed, i.e. no # SSL close notify alert is send or allowed to received. This violates # the SSL/TLS standard but is needed for some brain-dead browsers. Use # this when you receive I/O errors because of the standard approach where # mod_ssl sends the close notify alert. # o ssl-accurate-shutdown: # This forces an accurate shutdown when the connection is closed, i.e. a # SSL close notify alert is send and mod_ssl waits for the close notify # alert of the client. This is 100% SSL/TLS standard compliant, but in # practice often causes hanging connections with brain-dead browsers. Use # this only for browsers where you know that their SSL implementation # works correctly. # Notice: Most problems of broken clients are also related to the HTTP # keep-alive facility, so you usually additionally want to disable # keep-alive for those clients, too. Use variable "nokeepalive" for this. # Similarly, one has to force some clients to use HTTP/1.0 to workaround # their broken HTTP/1.1 implementation. Use variables "downgrade-1.0" and # "force-response-1.0" for this. # BrowserMatch "MSIE [2-6]" \ # nokeepalive ssl-unclean-shutdown \ # downgrade-1.0 force-response-1.0 </VirtualHost> </IfModule> root@raspberrypi:/etc/apache2/sites-available# service apache2 restart Enter passphrase for SSL/TLS keys for 127.0.1.1:4443 (RSA): *******
apache2/httpサービス再起動時にパスワード入力不要とする
- 現在のserver証明書のバックアップ
- パスワード無しの証明書を作成
元ファイルのバックアップ
# cp server.key server.key.org
パスフレーズの解除
# openssl rsa -in server.key -out server.key
apache2サービスを再起動し、パスワードが要求されないことを確認し、すべての手順終了です。