UPKIとApache2とNginx

Linux

はじめに

とあることでUPKIクライアント証明書を申請することになったのでメモ。
証明書を使用するパソコンで作業します。

環境

- Debian bookworm

手順

該当パソコンにログインします。

mkdir -m 700 upki
cd upki/

証明書を更新する場合は、前回に作成したファイル名を変更しておく。

mv rand.dat rand.dat-20240226
mv XXXXX.key XXXXX.key-20240226
mv XXXXX.csr XXXXX.csr-20240226

ランダムファイルを生成します。

head -c 1m /dev/urandom > rand.dat

秘密鍵を作成する
パスフレーズを付加して作成するには「-des3」、または「-aes256」を付加します。

/usr/bin/openssl genrsa -rand rand.dat 2048 > XXXXX.key

CSR(証明書発行要求書)を作成します。

/usr/bin/openssl req -new -key XXXXX.key -sha256 -out XXXXX.csr

opensslのバージョンによって若干メッセージが異なる。
最後の方に入力するOrganizational Unit Name、Email Address、A challenge password、An optional company nameは半角ドット「.」を入力します。

Country Name (2 letter code) [XX]:JP
State or Province Name (full name) []:Okinawa
Locality Name (eg, city) [Default City]:Nago
Organization Name (eg, company) [Default Company Ltd]:CompanyName
Organizational Unit Name (eg, section) []:.
Common Name (eg, your name or your server's hostname) []:XXXXX.jp
Email Address []:.

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:.
An optional company name []:.

生成したファイルの内容を確認し、XXXXX.csrファイルを何らかの手段でダウンロードします。

/usr/bin/openssl req -noout -text -in XXXXX.csr

証明書の更新は、該当パソコンにログインして、シリアルナンバーの確認が必要。
前回の登録時に届いたメールに記載されているシリアルナンバーと一致するか確認します。

openssl s_client -connect XXXXX.jp:443 </dev/null 2> /dev/null | openssl x509 -noout -serial

下記URLにアクセスしてTSVファイルを作成します。

TSVツール: トップメニュー

「TSVを作成する/既存のTSVを編集する」の「作成する」をクリックします。
以下の内容を入力して「この内容で作成を開始」をクリックします。

・TSVファイル種別は「新規発行申請用TSV」。(更新の場合は「更新申請用TSV」)
・証明書種別は「サーバ証明書」。
・証明書プロファイルは「サーバ証明書(sha256WithRSAEncryption)」。
・発行方法は空欄。

「CSRファイル読込」項目の「ファイル選択」をクリックして、作成したCSRファイルを選択、「読込」をクリックします。

以下の内容を入力して「完了」、「ダウンロード」でTSVファイルをダウンロードします。
氏名と所属はローマ字で記述します。

・失効対象証明書シリアル番号: (更新の場合は、確認したシリアルナンバーを入力します。)
・利用管理者E-mail:
・利用管理者氏名:
・利用管理者所属:
・Webサーバソフトウェア名等: // 例: Apache2、Nginxなど

該当施設の管理者にTSVファイルを送って手続きを依頼します。
UPKI事務局から「サーバ証明書発行受付通知」のSubjectでメールが届くので、証明書をダウンロードしてサーバに設定します。

証明書の配置

NginxとApache2.4.8以降の場合、SSLCertificateFileは、SSL証明書(csrファイル)と中間証明書(cerファイル)の順に記述したファイル(crtファイル)を作成して指定します。

sudo mkdir /etc/ssl/upki
cd /etc/ssl/upki

sudo cp ~/upki/XXXXX.jp.cer .
sudo cp ~/upki/XXXXX.key .
sudo cp ~/upki/XXXXX.csr .

su
cat XXXXX.csr XXXXX.jp.cer > XXXXX.crt
exit

sudo chmod 600 XXXXX.*

Apache2の場合

cd /etc/apache2/sites-available

sudo a2enmod rewrite
sudo a2enmod ssl

sudo cp default-ssl.conf ssl.conf
sudo vi ssl.conf

ssl.confの修正箇所です。
以下の変数なども適切に設定します。
・ServerAdmin
・DocumentRoot

SSLCertificateFile     /etc/ssl/upki/XXXXX.crt
SSLCertificateKeyFile  /etc/ssl/upki/XXXXX.key

非SSLのサイトをSSLサイトにリダイレクトするようにVirtualHostディレクティブの最後に記述します。

sudo vi normal.conf

下記を追加します。

<VirtualHost *:80>
   ServerAdmin webmaster@localhost
   ServerName XXXXX.jp
   DocumentRoot /home/www/html

   省略

   RewriteEngine On
   RewriteCond %{HTTPS} off
   RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
</VirtualHost>

Apache2を再起動します。

sudo systemctl restart apache2

Nginxの場合

Apache2と異なり、1個のファイルで設定します。
設定ファイルをexpとします。

cd /etc/nginx/sites-available
sudo vi exp

ファイルの内容です。
非SSLのサイトをSSLサイトにリダイレクトするように「return 301 https://$host$request_uri;」を記述します。

server {
    listen 80;
    server_name XXXXX.jp;
    return 301 https://$host$request_uri;
}

server {
    listen 443 ssl;
    #listen [::]:443 ssl http2 default_server;

    ssl_certificate     /etc/ssl/upki/XXXXX.cer;
    ssl_certificate_key /etc/ssl/upki/XXXXX.key;

    ssl_session_cache shared:SSL:1m;
    ssl_session_timeout 10m;

    charset utf-8;

    location / {
         root /home/www/html;
    }
}

Nginxを再起動します。

sudo systemctl restart nginx

Comments