SSLクライアント認証の利用(日レセ5.2以降)
最終更新日:2021年04月05日
概要
医院内に構築されているLAN(院内LAN)で日医標準レセプトソフト (以下日レセ) を使用するにあたり、第三者への情報漏洩を防ぐために通信を暗号化することが考えられます。
このドキュメントではglserverとクライアント間の通信をSSLで暗号化し、かつ証明書を利用した認証(以下SSLクライアント認証)を行うための、glserver、glclient2およびmonsiajに必要な作業を記載します。
このドキュメントの前提条件および範囲は以下の通りです。
-
glserverでのSSLクライアント認証
-
証明書形式はX.509v3(RFC3280)
-
日レセのバージョンは Ver.5.2.0 以降
-
OSはUbuntu 18.04/20.04
Ubuntu22.04 WebORCAオンプレはこちらを参照してください。
構成
SSLクライアント認証では、glserverだけでなくglclient2やmonsiajで利用するユーザアカウント毎に個別のX.509形式の証明書を持つ必要があります。X.509形式の証明書は商用サービス(ベリサインなど)やopensslコマンドで作成したものなど様々なものが利用できますが、本文書では組織内の簡易認証局を構築し、そこから発行した証明書を利用します。
以下に構成図を示します。
作業手順
作業の流れは以下のとおりです。
- 証明書の発行
-
組織内の簡易認証局を作成し、サーバ証明書とクライアント証明書を発行します。
- サーバ設定
- CA証明書とサーバ証明書をサーバに設置し、glserverがSSLクライアント認証を行うよう設定します。
- クライアント設定
- CA証明書をクライアントのシステムに設置します。またglclient2、monsiajにクライアント証明書を設置します。
認証局の作成と証明書の発行
認証局の作成と証明書を発行します。認証局には日レセ用認証局構築ツール orca-catool を利用します。
認証局サーバの用意
認証局を設置するサーバを用意します。条件は以下です。
- Ubuntu 18.04または20.04
- 日レセ用apt-lineが設定されている
認証局専用のサーバを用意するのが最も安全ですが、日レセ主サーバまたは従サーバでも構いません。
orca-catoolのインストール
認証局サーバでコンソールを開き以下のコマンド実行します。
% sudo apt-get install orca-catool
orca-catoolの起動および認証局作成
コンソールより以下のコマンドを実行します。
% orca-catool config file(/home/$USER/.orca_catool/config.yml) does not exist. initialize ca? y or n> y specify subcommand issue_server_cert issue_client_cert export_cert revoke_cert issue_crl list_cert
初回起動時は「initialize ca? y or n>」と表示されます。ここで'y'を入力すると認証局の初期化を行いCA証明書を作成します。デフォルトの設定ではサーバ証明書、クライアント証明書ともに有効期間は10年に設定されています。変更する場合は /home/$USER/.orca_catool/config.yml の 「:server_cert_validity」、「:client_cert_validity」 の値(日数)を編集してください。
サーバ証明書の発行
glserverのサーバ証明書を発行します。
サーバ証明書はクライアントからの接続の際に、クライアントが正しいサーバに接続しているか検証するために利用されます。クライアントでのサーバの検証はアクセス先のホスト名と証明書のSubjectAltNameフィールドまたはCNと一致しているかチェックすることで行います。そのためサーバ証明書にはクライアントがアクセスする際のホスト名またはIPアドレスを指定する必要があります。
正
- クライアントの接続先 -> https://orca-server1:8000/rpc/
- サーバ証明書のCNまたはSubjectAltName -> orca-server1
正
- クライアントの接続先 -> https://192.168.1.100:8000/rpc/
- サーバ証明書のCNまたはSubjectAltName -> 192.168.1.100
- クライアントの接続先 -> https://orca-server1:8000/rpc/
- サーバ証明書のCNまたはSubjectAltName -> 192.168.1.100
ホスト名を指定する場合
% cd % orca-catool issue_server_cert -c orca-server1
IPアドレスを指定する場合
% cd % orca-catool issue_server_cert -i 192.168.1.100
ホスト名、IPアドレス両方を指定することもできます。
% cd % orca-catool issue_server_cert -i 192.168.1.100 -c orca-server1
コマンドを実行すると $HOME/certs に 000002__JP_orca_192.168.1.100.zip (<シリアルナンバー>_JP_orca_<コモンネーム>.zip) のようなzipファイルが作成されます。
zipファイルを展開すると以下のようなファイルが格納されています。
- 000002__JP_orca_192.168.1.100/
- 000002__JP_orca_192.168.1.100.crt (サーバ証明書(X509 PEM形式))
- 000002__JP_orca_192.168.1.100.enc.pem (サーバ証明書秘密鍵(PEM形式 パスフレーズ設定))
- 000002__JP_orca_192.168.1.100.p12 (サーバ証明書(PKCS#12形式))
- 000002__JP_orca_192.168.1.100.pass (サーバ証明書パスフレーズ(テキスト))
- 000002__JP_orca_192.168.1.100.pem (サーバ証明書秘密鍵(PEM形式 パスフレーズなし))
- ca.crt (CA証明書(X509 PEM形式))
glserverの設定ではこのzipファイルのCA証明書とPKCS#12形式サーバ証明書を使用します。
クライアント証明書の発行
クライアント用証明書を発行します。
コンソールより以下のようにコマンドを実行します。
-cオプションにクライアント証明書のコモンネームを設定します。コモンネームは日レセの認証とは関係ないため、ユーザを識別する英数字であれば構いません。
% cd % orca-catool issue_client_cert -c user1
コマンドを実行すると $HOME/certs にサーバ証明書と同様のzipファイル(certs/000003__JP_orca_user1.zip)が作成されます。
認証局ツールのその他の操作
orca-catoolでは証明書発行以外に以下の操作が可能です。
- 証明書の破棄
- 証明書破棄リスト(CRL)の発行
- 発行済証明書のエクスポート
- 発行済証明書の検索
詳細は /usr/share/doc/orca-catool/README.md.gz を参照してください。
サーバの設定
証明書の設置
「サーバ証明書の発行」で作成したzipファイルを展開し、サーバ証明書、CA証明書を以下のパスでサーバ機に設置します。
項目名 | パス |
サーバ証明書 | /etc/jma-receipt/glserver.p12 |
CA証明書 | /etc/ssl/certs/gl-cacert.pem |
設置のコマンドの例を以下に示します。
% cd % cd certs/ % unzip 000002__JP_orca_192.168.1.100.zip % cd 000002__JP_orca_192.168.1.100 $ sudo cp ca.crt /etc/ssl/certs/gl-cacert.pem $ sudo cp 192.168.1.100.p12 /etc/jma-receipt/glserver.p12 $ sudo chown -R orca:orca /etc/jma-receipt/glserver.p12 $ sudo chmod 400 /etc/jma-receipt/glserver.p12サーバ証明書、CA証明書のパスはjma-receiptパッケージによってあらかじめ決められています。
パスを間違えた場合は日レセが起動しません。
日レセが起動しない場合は/var/log/syslogにエラーメッセージがないか確認してください。
glserverのSSLクライアント認証有効化
glserver起動時にSSLクライアント認証を有効化するよう設定を行います。
/etc/jma-receipt/jma-receipt.envに以下を追記します。
GLSERVER_SSL=true日レセの起動はsystemdのサービス(/etc/systemd/system/multi-user.target.wants/jma-receipt.service)から/usr/sbin/jma-receiptを実行することで行っています。/usr/sbin/jma-receiptから/etc/jma-receipt/jma-receipt.envを参照して設定変更が反映されます。またglserverのSSL証明書のパスも/usr/sbin/jma-receipt内に記載されています。
日レセの再起動
コンソールより以下のコマンドを起動します。
% sudo systemctl restart jma-receipt
glserverがSSLクライアント認証設定で起動した場合は、以下のようにsyslogに「glserver start (ssl)」のように表示されます。
Apr 5 11:30:24 u180452 panda/wfc[18091]: wfc start 4.0.0 20210329
Apr 5 11:30:24 u180452 panda/glserver[18197]: glserver start (ssl)
Apr 5 11:30:24 u180452 panda/glserver[18197]: verify peer
クライアントの設定
glclient2の設定
クライアント証明書の設置
クライアント証明書のzipファイルをglclient2を利用するUNIXユーザのホームディレクトリ以下にコピーして展開します。 ここではzipファイルが $HOME/certs/000003__JP_orca_user1.zip にあるとします。% cd % cd certs % unzip 000003__JP_orca_user1.zip % cd 000003__JP_orca_user1/ % chmod 600 *
ここでglclient2のランチャーの設定で必要となる秘密鍵のパスフレーズを表示してメモします。
% cat 000003__JP_orca_user1.pass 6RYv24bqgpyu6tn8
ランチャーの設定
glclient2を起動します。glclient2後、「基本」タブの「サーバ」に"https://(サーバ名またはIPアドレス):8000/rpc/"を設定します。また日レセのユーザ名、パスワードも設定します。
「SSL」タブを開き「SSLを使う」にチェックを入れます。
「CA証明書ファイル」、「証明書ファイル名」、「秘密鍵ファイル名」にそれぞれ「クライアント証明書の設置」で設置したファイルを指定します。「秘密鍵ファイル名」にはパスフレーズ付きの秘密鍵ファイル(*.enc.pem)を指定します。また「秘密鍵パスフレーズ」にメモしておいたパスフレーズを設定し、「秘密鍵パスフレーズの保存」にチェックを入れます。
日レセの画面が表示されたらクライアント認証成功です。
接続エラーのダイアログが表示された場合は、クライアント証明書、サーバ証明書、サーバのsyslogの確認を行なってください。
monsiajの設定
クライアント証明書の設置
monsiajを起動します。クライアント証明書のzipファイルをmonsiajを利用するWindowsマシンにコピーして展開します。展開後、秘密鍵パスフレーズファイル(*.pass)をメモ帳などで開き、パスフレーズをメモしておきます。ランチャーの設定
monsiaj起動後、「基本」タブの「サーバ」に"https://(サーバ名またはIPアドレス):8000/rpc/"を設定します。また日レセユーザ名、パスワードを設定します。
「SSL」タブを開き「SSLクライアント認証を使用」にチェックを入れます。
「CA証明書」、「クライアント証明書」にそれぞれ「クライアント証明書の設置」で設置したファイルを指定します。「クライアント証明書」にはPKCS#12形式の証明書ファイル(*.p12)を指定します。また「証明書パスワード」にメモしておいたパスフレーズを設定し、「証明書パスワードを保存」にチェックを入れます。
設定が完了したら「接続」ボタンをクリックします。
日レセの画面が表示されたらクライアント認証成功です。
接続エラーのダイアログが表示された場合は、クライアント証明書、サーバ証明書、サーバのsyslogの確認を行なってください。
トラブルシューティング
よくあるエラーケースを列挙します。
サーバ側
正しいパスにCA証明書が設置されていない
glserverが起動しません。syslogに以下のようなログが出力されます。
Aug 24 15:35:42 precise47 panda/glserver[818]: glserver start (ssl) Aug 24 15:35:42 precise47 panda/glserver[818]: SSL_CTX_load_verify_locations(/etc/ssl/certs/gl-cacert.pem) Aug 24 15:35:42 precise47 panda/glserver[818]: CTX make error
正しいパスにサーバ証明書が設置されていない
glserverが起動しません。syslogに以下のようなログが出力されます。
Aug 24 15:39:37 precise47 panda/glserver[2203]: glserver start (ssl) Aug 24 15:39:37 precise47 panda/glserver[2203]: SSL_CTX_use_certificate_file(/etc/jma-receipt/glserver.p12) failure:#012 error:2006F079:BIO routines:BIO_read:unsupported method Aug 24 15:39:37 precise47 panda/glserver[2203]: CTX make error
サーバ証明書にパスワードが設定されている
glserverが起動しません。syslogに以下のようなログが出力されます。
Aug 24 13:36:38 precise47 panda/glserver[31174]: glserver start (ssl) Aug 24 13:36:38 precise47 panda/glserver[31174]: PASSWORD input was canceled Aug 24 13:36:38 precise47 panda/glserver[31174]: Aug 24 13:36:38 precise47 panda/glserver[31174]: CTX make error
サーバ証明書のコモンネームが正しいホスト名またはIPアドレスになっていない
クライアントの接続時に以下のようなエラーダイアログが表示されます。
サーバ証明書の有効期限が切れている
またsyslogに以下のようなログが出力されます。
Aug 29 10:37:52 precise47 panda/glserver[21563]: glserver start (ssl) Aug 29 10:37:53 precise47 panda/glserver[21563]: The certificate(/C=JP/O=test/CN=localhost) will be expired in -1 days.#012Please update the certificate.
サーバ証明書の有効期限の警告
サーバ証明書の有効期限切れが近づくとsyslogに以下のようなログが出力されます。
Aug 29 10:42:21 precise47 panda/glserver[21884]: glserver start (ssl) Aug 29 10:42:21 precise47 panda/glserver[21884]: The certificate(/C=JP/O=test/CN=localhost) will be expired in 4 days.#012Please update the certificate.
glserverがSSL接続するよう設定されていない
クライアントにおいて、接続時に以下のようなエラーダイアログが表示され接続できません。
クライアント側
CA証明書が設定されていない
以下のようなエラーダイアログが表示されます。
クライアント証明書、あるいは秘密鍵が設定されていない
以下のようなエラーダイアログが表示されます。
クライアント証明書の有効期限が切れている
サーバ側のsyslogに以下のようなログが出力されます。
Aug 29 10:33:11 precise47 panda/glserver[21400]: Verification error of remote entity certificate:#012 depth=0#012 certificate has expired:/C=JP/O=test/CN=ormaster #012 Error in cert not_after field.#012 notAfter=Aug 29 00:51:32 2012 GM #012 SSL_accept failure:#012 error:140890B2:SSL routines:SSL3_GET_CLIENT_CERTIFICATE:no certificate returned