OpenVASでLets EncryptのSSL証明書を使うには

OpenVAS Managerのユーザー認証やWebインターフェイスへとhttps://で接続する場合にはデフォルトではOpenVMSのインストール時に生成される自己証明局(CA)やSSL証明書が使われるため、ブラウザによっては接続を拒否されてしまう場合もあるようです。
そこでSSL証明書をLet's Encryptで取得した正常なSSL証明書に入れ替えようと思ったのですが意外とネット上にも情報が少なく、いろいろと調べてみたのでその覚書です。

先ずはOpenVASの設定ファイルにSSL証明書の場所が記載されていないかを調べてみました。
すると、 /etc/openvas/openvassd.conf の中でSSL証明書の場所が設定されているのを発見したので、これをLet's Encryptで取得したSSL証明書と入れ替えてOpenVASのWebインターフェイスGreenbone Security Assistant(gsad)を再起動してみました。

#####/etc/openvas/openvassd.confの証明書設定と思わしき箇所
```shell:/etc/openvas/openvassd.conf
# Certificates
#
cert_file=/var/lib/openvas/CA/servercert.pem
key_file=/var/lib/openvas/private/CA/serverkey.pem
ca_file=/var/lib/openvas/CA/cacert.pem
```

残念ながらgsadではOpenVASの設定ファイルは読み込んでいないらしく、使われている証明書は以前のままの様です。
※実はこの設定はOpenVASをインストールした時に作ったOpenVAS ManagerとOpenVAS Scannerとの通信に使うSSL証明書のためのもので、これはいじってはいけないものだったようです…

/etc/openvas/gsad_log.confというgsadのログファイルに関する設定ファイルがあるので、もしかしたら/etc/openvas/gsad.confとかに設定できるのだろうか？とも思ったのですが、どこを探してもそんな情報はありません。

仕方がないのでgsadの起動スクリプト /etc/rc.d/init.d/gsad を読んでみたら、どうやらこのスクリプト中で直接パラメータをgsadに渡すしか手段は無いようです。 (環境変数の設定は /etc/sysconfig/gsad の中で行なうと良さそうです)

##### /etc/sysconfig/gsad での設定例
```shell:/etc/sysconfig/gsad
GSA_SSL_PRIVATE_KEY=/etc/letsencrypt/live/openvas.example.com/privkey.pem
GSA_SSL_CERTIFICATE=/etc/letsencrypt/live/openvas.example.com/fullchain.pem
```

~~※残念ながら中間証明書を指定することができないので、Let's Encrypt発行の証明書を使った場合、ブラウザなどでLet's Encryptがroot認証局としてインストールされていないブラウザではエラーになってしまいます。 (現在、解決策を模索中…)~~
**証明書と中間証明書が含まれるファイルfullchain.pemを証明書ファイルとして指定すればこの問題は解決出来ることがわかりました！**

### CentOS 7の場合
CentOS 7の場合、サービスを起動するためのスクリプトは/etc/systemd/system/multi-user.target.wants/gsad.serviceとなりますが、一応このスクリプトの中でCentOS 6などと同様に/etc/sysconfig/gsadが読み込まれているものの、SSL証明書に関する設定GSA_SSL_PRIVATE_KEYとGSA_SSL_CERTIFICATEがgsadへと渡されている様子がないので、SSL証明書を変更したい場合には/etc/systemd/system/multi-user.target.wants/gsad.serviceに若干の修正を加えなければなりません。

オリジナルの/etc/systemd/system/multi-user.target.wants/gsad.service

```shell:/etc/systemd/system/multi-user.target.wants/gsad.service
[Unit]
Description=OpenVAS Manager
After=network.target
After=openvas-scanner.service
After=openvas-manager.service

[Service]
Type=forking
EnvironmentFile=-/etc/sysconfig/gsad
ExecStart=/usr/sbin/gsad --listen $GSA_ADDRESS --port $GSA_PORT --mlisten $MANAGER_ADDRESS --mport $MANAGER_PORT $OPTIONS
Restart=always
RestartSec=1
User=root
Group=root
TimeoutSec=1200

[Install]
WantedBy=multi-user.target
```

/etc/sysconfig/gsadで設定されたGSA_SSL_PRIVATE_KEYとGSA_SSL_CERTIFICATEをgsadに引き渡す様に変更を加える

```shell:/etc/systemd/system/multi-user.target.wants/gsad.service
[Unit]
Description=OpenVAS Manager
After=network.target
After=openvas-scanner.service
After=openvas-manager.service

[Service]
Type=forking
EnvironmentFile=-/etc/sysconfig/gsad
ExecStart=/usr/sbin/gsad --listen $GSA_ADDRESS --port $GSA_PORT --mlisten $MANAGER_ADDRESS --mport $MANAGER_PORT $OPTIONS --ssl-private-key $GSA_SSL_PRIVATE_KEY --ssl-certificate $GSA_SSL_CERTIFICATE
Restart=always
RestartSec=1
User=root
Group=root
TimeoutSec=1200

[Install]
WantedBy=multi-user.target
```

/etc/systemd/system/multi-user.target.wants/gsad.serviceに変更を加えた後はsystemdのデーモンをリロードしないと設定が反映されないのでご注意を！

```shell:
# systemctl daemon-reload
```

### 参考資料

#####/etc/rc.d/init.d/gsad で設定可能な環境変数とその内容
|環境変数|内容|
|:-----------------|:------------------|
|GSA_ADDRESS|gsadで待機するアドレスを指定します|
|GSA_PORT|gsadで待機するポート番号を指定します|
|GSA_SSL_PRIVATE_KEY|SSL証明書のプライベートキーファイル(pem)の場所を指定します|
|GSA_SSL_CERTIFICATE|SSL証明書(pem)の場所を指定します|
|GSA_REDIRECT|HTTPをHTTPSにリダイレクトします|
|GSA_REDIRECT_PORT|このポート番号<ポート番号>からHTTPにリダイレクトします。|
|MANAGER_ADDRESS|OpenVASマネージャーのIPアドレス。|
|MANAGER_PORT|OpenVASマネージャのポート番号|

#####gsad起動時に指定可能なオプションの一覧
|オプション|内容|
|:------------------|:------------------------------------------------------------|
|--drop-privileges|特権を削除します。|
|-f、--foreground|フォアグラウンドで実行します。|
|--http-only|SSLを使用せずにHTTPのみを提供します。|
|--listen=<IPアドレス>|<IPアドレス>で待機します。|
|--mlisten=<IPアドレス>|OpenVASマネージャーのIPアドレス。|
|-p、--port=<ポート番号>|ポート番号に<ポート番号>を使用します。|
|-m、--mport=<ポート番号>|OpenVASマネージャのポート番号に<ポート番号>を使用します。|
|-r、--rport=<ポート番号>|このポート番号<ポート番号>からHTTPにリダイレクトします。|
|-R、--redirect|HTTPをHTTPSにリダイレクトします。 (これはデフォルト動作です)|
|--no-redirect|HTTPをHTTPSにリダイレクトしません。|
|-v、--verbose|進行状況メッセージを表示します。|
|-V、--version|バージョンを出力して終了します。|
|-k、--ssl-private-key=<ファイル>|<ファイル>をHTTPSの秘密鍵として使用します。|
|-c、--ssl-certificate=<ファイル>|HTTPSの証明書として<ファイル>を使用します。|
|--dh-params=<ファイル>|Diffie-Hellmanパラメータファイル|
|--do-chroot|chrootを実行します。|
|--secure-cookie|安全なcookieを使用します。 （HTTPS使用時には暗黙で指定されます）|
|--timeout=<数値>|セッションを終了するまでのユーザーアイドル時間。 (分)|
|--debug-tls=<レベル>|<レベル>でTLSデバッグを有効にする|
|--gnutls-priorities=<文字列>|GnuTLS優先順位文字列。|
|--face=<ディレクトリ>|サブディレクトリ<ディレク>のインタフェースファイルを使用します。|
|--guest-username=<ユーザ名>|ゲストユーザのユーザ名。ゲストログインを有効にします。|
|--guest-password=<パスワード>|ゲストユーザのパスワード。デフォルトはゲストのユーザ名です。|
|--http-frame-opts=<frame-opts>| X-Frame-Options HTTPヘッダー。デフォルトは「SAMEORIGIN」です。|
|--http-csp = <csp>|Content-Security-Policy HTTPヘッダー。デフォルトは "default-src 'self" unsafe-inline "; img-src' self 'blob :; frame-ancestors' self '"です。|
|--http-guest-chart-frame-opts=<frame-opts>|X-Frame-OptionsゲストチャートのHTTPヘッダー。デフォルトは ""です。|
|--http-guest-chart-csp = <csp>|コンテンツセキュリティポリシーHTTPヘッダー。デフォルトは "default-src 'self" unsafe-inline "; img-src' self 'blob :; frame-ancestors *"になります。|