読者です 読者をやめる 読者になる 読者になる

Linux上のOwinHost.exeでhttpsを利用する

HTTPS対応

前回の記事、「Ubuntu 12.04.3 LTS に Katana(OwinHost.exe) をインストールする - espresso3389の日記」でOwinHost.exeをLinux上で動かしましたが、実験はhttp止まりでした。

OwinHost.exeの設定にURLを指定する部分があるので、普通に考えれば、

espresso3389@nu:~/katana$  ./OwinHost.2.0.2/tools/OwinHost.exe -u https://192.168.0.18:8080/

などとやれば、動くんじゃ無いの?って思うところですが、これでは動きません。
というのも、実のところ、これだけでは、Windows上でOwinHost.exeを動かすことすらできません。

SSL証明書

証明証なのか、証明書なのかだんだん分からなくなってきますが、Certificateのことです。サーバーなので、いわゆる、秘密鍵をインストールしておかないといけません。Windowsでこれをやるには、netsh add sslcertで、証明書ストアにある証明書を指定すれば良いんですが、netshはどう考えても、Linux上で利用できるコマンドではありません。

httpcfg

Monoが提供するnetsh相当の機能は、httpcfgというコマンドによって提供されます。これに、秘密鍵(pvk形式)と証明書(crt形式)のファイルを指定して、特定のポートでSSLが利用できるように構成します。

ただし、Apacheなどで利用されている証明書や秘密鍵は、通常、pem形式で保存されています。

Apache用に証明書を購入した場合にもpem形式。

Windowsや、Monoでは、秘密鍵はpvk形式、証明書は、crt形式(DER形式)で利用されるので、変換しないといけません。
最初から、Windows用の証明書を用意できている場合には、変換の部分は無視してください。

ちなみに、下記で利用している秘密鍵、証明書は、Ubuntu 12.04.3のApacheでは次のように設定されている物です。

SSLCertificateFile    /etc/ssl/certs/certificate.pem
SSLCertificateKeyFile /etc/ssl/private/privatekey.pem

さらに言えば、privatekey.pemは、通常は、rootしか見ることが出来ないような権限が設定されています。それほど重要機密と言うことなので、取り扱いには要注意です。

秘密鍵の変換

秘密鍵(pvk)の変換には、opensslも利用できますが、残念なことにパスフレーズによる暗号化なしの状態の出力はさせてくれません。そのため、Mono用にpvkへの変換を行うには、Windows上で、pvk.exeを利用するしかないようです。
pvk.exeは、いろんな所でダウンロードできるようですが、COMODOへのリンクを張っておきます。

PVK.zip - COMODO

で、実際にどうやって変換するかというと、

C:\Users\espresso3389\work>pvk -in privatekey.pem -topvk -nocrypt -out privatekey.pvk

このファイルをどうにかして、Linux側のホストにコピーします。

証明書の変換

pem形式から、crt形式への変換はOpenSSLを使えば簡単に行えます。

openssl x509 -in certificate.pem -outform DER -out certificate.crt

ポートに対して関連付け

下の例では、8080で動作するHttpListenerに対して、秘密鍵(privatekey.pvk)と、証明書(certificate.crt)を設定しています。

espresso3389@nu:~/katana$ httpcfg -add -port 8080 -pvk privatekey.pvk -cert certificate.crt

起動(問題あり...)

最初に書いた通りです。

espresso3389@nu:~/katana$  ./OwinHost.2.0.2/tools/OwinHost.exe -u https://192.168.0.18:8080/

・・・・・が、手元でブラウザを起動してアクセスしてみたところ、クライアント証明書を要求されるようです。キャンセルできるけど。

これは、netsh add sslcertでいうところの、clientcertnegotiationだと思うんだけど、どこにもそんなもの存在しないんですよね。

現在、これがどうやったら回避できるのかを調べています...。