glserverのSSLクライアント認証を利用した接続(日レセ4.8)
最終更新日:2017年01月31日
概要
医院内に構築されているLAN(院内LAN)で日医標準レセプトソフト (以下日レセ) を使用するにあたり、第三者への情報漏洩を防ぐために通信を暗号化することが考えられます。
このドキュメントではglserverとクライアント間の通信をSSLで暗号化し、かつ証明書を利用した認証(以下SSLクライアント認証)を行うための、glserver、glclient2およびmonsiajに必要な作業を記載します。
このドキュメントの前提条件および範囲は以下の通りです。
glserver-クライアント間のSSLクライアント認証を対象
証明書形式はX.509v3(RFC3280)で定義される仕様に従ったものを対象
日レセのバージョンは Ver.4.8.0
glserverの動作環境はUbuntu 14.04 以降
構成
SSLクライアント認証では、glserverだけでなくglclient2やmonsiajで利用するユーザアカウント毎に個別のX.509形式の証明書を持つ必要があります。X.509形式の証明書は商用サービス(ベリサインなど)やopensslコマンドで作成したものなど様々なものが利用できますが、本文書では組織内の簡易認証局を構築し、そこから発行した証明書を利用します。
以下に構成図を示します。
作業手順
作業の流れは以下のとおりです。
- 証明書の発行
組織内の簡易認証局を作成し、サーバ証明書とクライアント証明書を発行します。
- サーバ設定
- CA証明書とサーバ証明書をサーバに設置し、glserverがSSLクライアント認証を行うよう設定します。
- クライアント設定
- CA証明書をクライアントのシステムに設置します。またglclient2、monsiajにクライアント証明書を設置します。
証明書の発行
組織内で証明書を発行、管理する「プライベートCA構築ツール」を利用し、サーバ証明書、クライアント証明書を発行します。
プライベートCA構築ツールについては文書「プライベートCA構築ツールの利用」を参照してください。
CA証明書の作成
プライベートCA構築ツールを起動し「CA証明書作成」画面を表示します。既に認証局を設定している場合は、メニューの「ファイル」->「新規CAの作成」を選択し、「CA証明書の作成」画面を起動します。
「CA証明書作成」画面で以下の設定項目を入力し、CA証明書を作成します。
- 新しいCAの名前
- CAの名称を入力します。
- 組織名(必須)
- CAを利用する組織名(医院名など)をローマ字で入力します。
- コモンネーム(必須)
- CA証明書の名前をローマ字で入力します。
- CA鍵のパスワード
- CAの私有鍵にパスワードを設定する場合は値を入力します。数字とアルファベットが利用可能です。
- CA鍵のパスワード(確認)
- 入力確認のため、「CA鍵のパスワード」と同じ値を入力します。
サーバ証明書の発行
glserverが使用する証明書を発行します。「証明書タブウィンドウ」を開き、「新規」ボタンをクリックし、「証明書要求の編集」画面を開きます。
「証明書要求の編集」画面でコモンネームにクライアントが接続する際に指定するサーバ名、あるいはIPアドレスを入力します。
コモンネームに正しいサーバ名、IPアドレスが設定されていない場合、SSL接続に失敗します(クライアント側でサーバとの接続を拒否します)。
証明書要求の設定後「CAによる署名」画面でプロファイルを「orca-server」に設定します。
プロファイルが「orca-server」でない場合はSSL接続に失敗します。
- CA鍵のパスワード
- 「CA証明書の作成」画面でパスワードを設定した場合、パスワードを入力します。
- プロファイル
- プルダウンメニューから「orca-server」を選択します。
発行後、証明書タブに発行したサーバ証明書のエントリがあることを確認します。
サーバ証明書のエクスポート
発行したサーバ証明書とCA証明書をエクスポートし、USBメモリ等の外部メディアに格納します。プライベートCA構築ツールの「証明書タブウィンドウ」を開き、サーバ証明書のエントリの上で画面を右クリックします。
ポップアップウィンドウで「エクスポート(PKCS#12)」を選択します。
パスワード入力画面で、パスワード欄は空のまま「OK」をクリックします。
パスワードを設定するとglserverがサーバ証明書を利用できず日レセが起動しなくなります。
「空のパスワードを設定しますか?」と警告画面が表示されるので、「OK」をクリックします。
次の「出力ファイル保存」画面でサーバ証明書を適切な場所に保存します。保存後、サーバ証明書をUSBメモリなどのメディアにコピーします。
サーバ証明書は漏洩しないよう厳重に管理する必要があります。
次にCA証明書をメディアに格納します。
「認証局」タブをクリックして「認証局タブウィンドウ」に移動します。
「認証局タブウィンドウ」の「CA証明書のエクスポート(PEM)」ボタンをクリックし、CA証明書を保存します。
保存したCA証明書をメディアにコピーします。
クライアント証明書の発行
クライアントで利用する証明書を発行します。
「証明書タブウィンドウ」を開き、「新規」ボタンをクリックし、「証明書要求の編集」画面を開きます。
コモンネームに証明書を使用する職員のフルネーム等、ユーザを特定する名前を設定します。
※日レセ4.8ではコモンネームに証明書を利用する日レセユーザ名を設定します(あるいはここで設定したコモンネームを日レセユーザ名にします)。
※日レセ5.0ではコモンネーと日レセユーザ名を連動させる必要はありません。
証明書要求の設定後「CAによる署名」画面でプロファイルを「orca-client」に設定します。
またユーザ名にクライアント証明書が対応する日レセユーザ名を設定します。
プロファイルが「orca-client」でない場合は、SSL接続に失敗してサーバに接続できません。
ユーザ名は後で証明書タブウィンドウでも設定、変更できます。
- CA鍵のパスワード
- 「CA証明書の作成」画面でパスワードを設定した場合、パスワードを入力します。
- プロファイル
- プルダウンメニューから「orca-client」を選択します。
- ユーザ名
- glserverにログインするユーザ名を指定します。このユーザ名はあらかじめ日レセに登録されている必要があります。
「OK」ボタンをクリックしクライアント証明書を発行します。
証明書タブに発行したクライアント証明書のエントリがあることを確認します。
クライアント証明書のエクスポート
発行したクライアント証明書とCA証明書をエクスポートし、USBメモリ等の外部メディアに格納します。
プライベートCA構築ツールの「証明書タブウィンドウ」を開き、クライアント証明書のエントリの上で画面を右クリックします。
ポップアップウィンドウで「エクスポート(PKCS#12)」を選択します。
パスワード入力画面でパスワードを設定し「OK」をクリックします。
monsiajではパスワードなしのクライアント証明書は利用できません。glclient2ではパスワードなしのクライアント証明書を利用できます。
次の「出力ファイル保存」画面でクライアント証明書を適切な場所に保存します。保存後、サーバ証明書をUSBメモリなどのメディアにコピーします。
クライアント証明書は漏洩しないよう厳重に管理する必要があります。
次にCA証明書をメディアに格納します。
「認証局」タブをクリックして「認証局タブウィンドウ」に移動します。「認証局タブウィンドウ」の「CA証明書のエクスポート(PEM)」ボタンをクリックし、CA証明書を保存します。保存したCA証明書をメディアにコピーします。
サーバの設定
証明書の設置
「サーバ証明書のエクスポート」でメディアに格納したサーバ証明書、CA証明書をサーバ機に設置します。それぞれのパスは以下です。
項目名 | パス |
サーバ証明書 | /etc/jma-receipt/glserver.p12 |
CA証明書 | /etc/ssl/certs/gl-cacert.pem |
メディアを利用した設置の例を以下に示します。メディアは/media/MEDIAにマウントされていて、直下に以下のファイルがあるものとします。
項目名 | パス |
サーバ証明書 | /media/MEDIA/192.168.1.100.p12 |
CA証明書 | /media/MEDIA/ca.pem |
$ sudo cp /media/MEDIA/ca.pem /etc/ssl/certs/gl-cacert.pem $ sudo cp /media/MEDIA/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証明書、ユーザDBファイルのパスはjma-receiptパッケージによってあらかじめ決められています。
パスを間違えた場合は日レセが起動しません。
日レセが起動しない場合は/var/log/syslogにエラーメッセージがないか確認してください。
jma-receiptパッケージの再設定
jma-receiptパッケージを再設定します。以下のコマンドを実行します。
$ sudo /usr/sbin/dpkg-reconfigure jma-receipt
SSLを有効にするか問い合わせる画面が表示されるまで設定画面のデフォルトの値を変更せずに作業を進めます。
「SSLを有効にしますか」には「はい」を選択し、その後の画面では表示されるデフォルトの設定を選択して設定画面を終了します。
クライアントの設定
glclient2の設定
クライアント証明書の設置
「クライアント証明書のエクスポート」でメディアに格納したクライアント証明書を設置します。以下のコマンド例ではメディアは/media/MEDIAにマウントされているものとします。
CA証明書を/etc/ssl/certsディレクトリにコピーします。
サーバと同一機材を使用する場合は、この作業は不要です。
$ sudo cp /media/MEDIA/ca.pem /etc/ssl/certs/gl-cacert.pemクライアント証明書を日レセクライアント利用者のUNIXアカウントのホームディレクトリにコピーします。
ここでは例として、UNIXアカウントが doctor1 で、クライアント証明書が doctor1.p12 というファイル名でメディアに格納されているものとします。適宜読みかえて作業を行ってください。
$ sudo mkdir -p ~doctor1/.glclient $ sudo cp /media/MEDIA/doctor1.p12 ~doctor1/.glclient
他のユーザがアクセスできないようクライアント証明書の権限を変更します。
$ sudo chown -R doctro1:doctor1 ~doctor1/.glclient/ $ sudo chmod 500 ~doctor1/.glclient/ $ sudo chmod 400 ~doctor1/.glclient/doctor1.p12
ランチャーの設定
glclient2を起動します。
glclient2のランチャーが起動したら「基本」タブの「ホスト(ポート)」にサーバ証明書のコモンネームに設定したホスト名を指定します。
「SSL」タブを開き「SSLを使う」にチェックを入れます。
「証明書ファイル」の「参照」ボタンをクリックして「クライアント証明書の設置」で設置した証明書を指定します。
設定が完了したら、「接続」ボタンをクリックします。
クライアント証明書にパスワードが設定されている場合、パスワード入力ダイアログが表示されるのでパスワードを入力します。
日レセの画面が表示されたらクライアント認証に成功しています。
失敗する場合は、クライアント証明書、サーバ証明書、サーバのsyslogの確認を行なってください。
monsiajの設定
CA証明書の設置
CA証明書の設置方法はOSによって異なります。
LinuxでのCA証明書の設置
keytoolコマンドを利用して検証用証明書ストアを作成します。下記にコマンドの実行例を示します。
- ここではCA証明書はca.pemというファイル名とします。適宜読み替えてください。
- 検証用証明書ストアのパスは $HOME/.java/deployment/security/trusted.jssecacertsと決められています。
- 途中パスワードの入力を求められますので6桁以上の英数字で設定します。確認のため2回パスワードを入力する必要があります。
- 最後にCA証明書を承認するか尋ねられるので「yes」を入力します。
$ cd $ mkdir -p .java/deployment/security $ LANG=C keytool -importcert -file ca.pem -keystore .java/deployment/security/trusted.jssecacerts Enter keystore password: ********[ENTER] Re-enter new password: ******[ENTER] Owner: CN=Nichii Clinic CA, O=Nichii Clinic, C=JP Issuer: CN=Nichii Clinic CA, O=Nichii Clinic, C=JP Serial number: 1 Valid from: Fri Mar 30 11:01:10 JST 2012 until: Mon Mar 28 11:01:10 JST 2022 Certificate fingerprints: MD5: 48:40:AF:C3:AD:05:BB:F8:CF:74:72:DF:E6:45:D5:93 SHA1: A3:21:2B:AE:D3:69:0F:7E:47:D6:DA:36:A9:C1:4F:FF:71:12:80:B0 SHA256: E0:44:AA:4D:E0:C3:C9:1A:A7:07:EE:BC:15:10:4B:8D:35:25:88:92:BA:A7:58:EE:AD:A3:94:21:F4:22:3F:86 Signature algorithm name: SHA1withRSA Version: 3 Extensions: #1: ObjectId: 2.5.29.14 Criticality=false SubjectKeyIdentifier [ KeyIdentifier [ 0000: 61 B4 CA 07 6A E8 66 3E EE 2B 63 E2 C6 A2 F5 82 a...j.f>.+c..... 0010: 9E 3F 24 12 .?$. ] ] #2: ObjectId: 2.5.29.15 Criticality=true KeyUsage [ Key_CertSign Crl_Sign ] #3: ObjectId: 2.5.29.19 Criticality=true BasicConstraints:[ CA:true PathLen:0 ] Trust this certificate? [no]: yes[ENTER] Certificate was added to keystore $
WindowsでのCA証明書の設置
以下の手順で行います。
- 「スタートメニュー」->「コントロールパネル(クラシック表示)」->「Java」で「Javaコントロールパネル」を開きます。
- 「セキュリティ」タブをクリックします。
- 「証明書」ボタンをクリックし、「証明書」ウィンドウを開きます。
- 「証明書タイプ」で「セキュアサイトCA」を選択し、「ユーザ」タブを選択します
- 「インポート」ボタンをクリックしてファイルの選択画面を開き、「ファイルタイプ」を「AllFiles」に変更します。
- CA証明書を選択して「開く」ボタンをクリックして画面を閉じます。
- 「ユーザ」タブの中に証明書エントリが増えていることを確認し、画面を閉じます。
- 「Javaコントロールパネル」を終了します。
Mac OS XでのCA証明書の設置
以下の手順で行います。
- FINDER上でCA証明書のファイルをダブルクリックします。
- 確認ダイアログが表示されるので「常に信頼」ボタンをクリックします。
- 管理者パスワードを入力し、「設定をアップデート」ボタンをクリックします。
- CA証明書が追加されたことを確認し、キーチェーンアクセスを終了します。
ランチャーの設定
- monsiajを起動します。
- 「基本設定」タブの「ホスト名」にサーバ証明書のコモンネームで設定したホスト名を指定します。
- 「SSL設定」タブに移動し、「SSLを使用」にチェックを入れて「クライアント証明書」ボックスにクライアント証明書のパスを指定します。
- クライアント証明書ファイルのパスワードを「パスワード」ボックスに入力します。
- 「実行」ボタンをクリックし、日レセ画面が表示されることを確認します。
- パスワードを保存する場合は、「基本設定」タブの「パスワードを保存」チェックボックスにチェックします。
- monsiajではパスワードが設定されていないクライアント証明書ファイルは利用できません。
- 下記のエラーダイアログが表示された場合は、CA証明書の設定に問題があります。「中止する」を選択して monsiaj を終了し、CA証明書の設定の確認をしてください。
- その他のエラーダイアログが表示される場合は、クライアント証明書、サーバ証明書の確認、サーバ側での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
正しいパスにユーザDBが設置されていない
glserverは起動しますが、認証に必ず失敗するためクライアントが接続できません。
クライアント接続時、syslogに以下のようなログが出力されます。
Aug 24 15:40:35 precise47 panda/glserver[2377]: glserver start (ssl) Aug 24 15:40:39 precise47 panda/wfc[2378]: wfc start Aug 24 15:41:24 precise47 panda/glserver[2596]: [doctor1@192.168.1.100] "glclient2/1.4.7" session start Aug 24 15:41:24 precise47 panda/glserver[2596]: [/etc/jma-receipt/userdb] can not open password file: No such file or directory
サーバ証明書にパスワードが設定されている
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 24 16:05:23 precise47 panda/glserver[3107]: glserver start (ssl) Aug 24 16:05:28 precise47 panda/wfc[3108]: wfc start Aug 24 16:07:39 precise47 panda/glserver[3340]: SSL_accept failure:#012 error:14094413:SSL routines:SSL3_READ_BYTES:sslv3 alert unsupported certificate
サーバ証明書の有効期限が切れている
クライアントにおいて、接続時に以下のようなエラーダイアログが表示され接続できません。
また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.
ユーザDBにユーザが登録されていない
クライアントにおいて、接続時に以下のようなエラーダイアログが表示され接続できません。
またsyslogに以下のようなログが出力されます。
Aug 24 16:45:33 precise47 panda/glserver[3903]: [ormaster@192.168.1.101]"glclient2/1.4.7" session start Aug 24 16:45:33 precise47 panda/glserver[3903]: invalid subject: /C=JP/O=test/CN=ormaster
ユーザDBのユーザが間違っている
クライアントは接続可能ですが、日レセユーザが登録されていないため以下の画面になります。
glserverがSSL接続するよう設定されていない
クライアントにおいて、接続時に以下のようなエラーダイアログが表示され接続できません。
クライアント側
CA証明書が設定されていない
以下のようなエラーダイアログが表示されます。
クライアント証明書が設定されていない
以下のようなエラーダイアログが表示されます。
クライアント証明書のプロファイルが間違っている
以下のようなエラーダイアログが表示されます。
またサーバ側のsyslogに以下のようなログが出力されます。
Aug 27 09:40:47 precise47 panda/glserver[19850]: Verification error of remote entity certificate: #012 depth=0#012 unsupported certificate purpose:/C=JP/O=test/CN=ormaster#012SSL_accept failure: #012 error:140890B2:SSL routines:SSL3_GET_CLIENT_CERTIFICATE:no certificate returned
クライアント証明書の有効期限が切れている
以下のようなエラーダイアログが表示されます。
またサーバ側の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