当社はIT技術のオンライン教育を得意としたセミナー専門会社です。 | 一戸英男

ITエンジニアの技術力UPをお約束します。

備忘録:Windows環境 Java Tomcat SSL対応(有償SSLライセンス編)

備忘録:Windows環境 Java Tomcat SSL対応(有償SSLライセンス編)


WindowsのJava環境でサーブレット・JSPを利用する際にTomcatを使いますが、テスト用のSSLは簡単に作れるしオレオレ証明書もやり方が紹介されいるサイトは沢山あるが、残念ながら今のブラウザ事情にはあっていない。つまりhttpsにしたときにバッテンがついたり、「安全ではないサイト」という形で表示されてしまう。


オレオレ証明書もやり方しだい(自己認証局証明書のブラウザ埋め込み)ではきちんと緑色にURLの先頭アイコンに表示されます。しかし、今はテスト用のSSLなら1000円で買える時代。今回は意外と調べても少ない正規品のSSL証明書を購入してWindowsのTomcatに導入する場合の方法を案内します。実はLinuxでは簡単なのですがWindowsは少し手間が増えます。それは鍵の形式が一般的なものと異なるからです。

TomcatのSSL化には必須のserver.xmlの編集

鍵の変換

Tomcatでは鍵の配置場所をキーストアと呼び、そこに配置するサーバ証明書類の群はキーストアファイルと呼んでいます。

リナックスではSSLの設置は簡単で、そのままの発行局から承認された証明書ファイルを設置できます。一方Windowsの場合はPKCS12の形式でファイルを作る必要があります。変換された証明書は更にJava KeyStore (JKS) に変換します。これは外部の「公開鍵証明書」や「秘密鍵と公開鍵証明書の組」を取り込むことができる形式です。

  • キーストア:server.keystore
  • ルート証明書:ca.crt
  • 秘密鍵:server.key
  • サーバ証明書:server.crt

下記はコマンドプロンプトで実行してください。

これを所定の位置にserver.keystoreとして配置すれば問題ありません。server.xmlの「keystoreFile」を編集しTomcatの再起動で設定は反映されます。

タグ: , , , ,

Python3 Bottleフレームワーク入門(その10)- WSGI via uwsgi Server on SSL


今回は、Pythonでお馴染みのWSGI(外部サーバ)の技術を使ったSSL接続を試してみます。

WSGIとはシンプルすぎて非常にわかりにくいものですが、簡単に言うと通常コマンドラインで標準出力しているものを内部及び外部のhttpサーバで使われているネットワークの土管にバイパスしてブラウザへの表示を拝借してしまおうという発想です。

bottleフレームワークはもとからWSGIの内部WEBサーバを走らせる機能が標準装備しているため外部WEBサーバ使う理由に何が必要なのか?という疑問を持つ人もいると思います。それはbottleの標準WEBサーバはシングルスレッドなので多くの接続を処理したり、SSL接続をしたい場合はこのようにWSGIの外部サーバ連携する技術を駆使しないと現実的なWEBサーバとして利用できないのです。ではまず最初にbottleで簡単なWEBサーバを起動してみましょう。

index.pyを実行するとシンプルなWEBサーバ(正確に言うとシングルスレッド内部WSGIサーバです。)が起動します。

ここまでは誰でも普段からやっていると思います。

今度はこれを外部接続WSGI仕様に変えてソースを改良します。
特にWSGI関連ライブラリーを呼び出す必要はありません。ポイントはapplicationというクラスです。uWSGIから呼び出すため、mainは生成されずelseへ分岐します。ここへbottleのインスタンスを渡してあげます。このケースではdefault_app()ですが、もしご自分でbottleのインスタンスを他の変数やクラスへ継承させているならそれを代入しましょう。これがWSGI仕様にする要になります。

最下行にたった2行が追加されました。たったこれだけです。大変シンプルですね。

次はuwsgiというシンプルな外部WSGI接続が可能なWEBサーバーをpipでインストールします。

これでブラウザへ接続をすれば「Hello World! Bottle and uWSGI!」と表示されます。

次にwsgiでSSL接続を行ってみましょう。pythonのプログラムは特に修正する必要はありません。uwsgiのネットワークトンネルを拝借していますから、SSLの処理はuwsgiの機能で行います。


テスト環境でSSLサーバの設置を行う場合のやり方

よくオレオレ証明書を使う方がいますが、今は安いSSL証明書なら年間ライセンス1000円程度で購入できます。私はテスト用に1000円のSSLライセンスを購入して実験利用しています。
テスト環境で実験する場合はWindows側では”c:\Windows\System32\Drivers\etc\hosts”を管理者権限モードでテキストエディタで開いてDNSの照合よりも先にhostsファイルに登録したドメインとIPアドレスを参照するように予めテスト用のドメインを登録しておきます。ドメイン認証だけのSSLならこれでうまくいきます。それ以外の認証が入っている高価なSSLだと「安全ではない」がでるかもしれません。


こうすることで、SSL証明書のドメインとテスト用のサーバのドメインを一致させブラウザを騙します。そうしないとhttps接続時に赤色でバツや三角がブラウザ上のURLそばのアイコンが表示されます。


証明書の準備と取得証明書のマージ処理からサーバ起動まで

証明書が購入できたら次に作業するフォルダーに証明書用のフォルダーを作成します。今はとりあえずauthという名前のフォルダーを作成します。そこに購入した証明書ファイルを配置します。以下のような最低でも3種類のファイルが必要となります。

  • サーバー証明書(server.crt)
  • サーバ秘密鍵(server.key)
  • 中間証明書(ca-bundle.ca)

これらのファイルで中間証明書はuwsgiコマンドのパラメータで指定する事ができないため、中間証明書とサーバ証明書は1つのファイルにマージします。

マージされた証明書は必ず一度エディターで中を開けてチェックして下さい。順番は関係あります。サーバ証明書が一番上に来るようにして下さい。また中間証明書はサーバ証明書のend区切りコメントに連続にならないように改行を必ず入れてください。そうしないとエラーになります。

下記は証明書を結合した場合の証明書同士のボーダーを示しています。予め結合する前にサーバ証明書に改行を入れておくと安全です。必ず結合後はチェックしましょう。

次のようにuwsgiを起動する際に鍵ファイルや証明書を指定します。

実際の実行時のターミナル画面は次のようになります。

実際に本番稼働させる場合は実行用のユーザとグループを用意してchrootさせて実行すると以下の警告はなくなります。

その他uwsgiの実行オプションはここ

パラメータでスレッド数、プロセス数やパフォーマンスに関するその他の項目、ログの場所など細かくチューニングが可能です

スレッド数やプロセス数を増やせば必ずしもマルチスレッドに対応したコンテンツになるとは限りません。例えばコンテンツがREAD主体の静的コンテンツはスレッド数やプロセス数を増やせばマルチスレッドになると思いますが、動的に変化するコンテンツは内部側でもマルチスレッド対応(thread_safeは必須)にしないと駄目なケースが多いと思います。というか、多くのケースはPythonコンテンツ側もマルチスレッド動作に対応する必然性があるかもしれません。マルチスレッド対応とは2種類の意味があります。DBなどファイル書き込みが複数のスレッドで競合が起きないようにするという意味と複数のコネクションを1プロセスで捌くという意味です。今回の場合はスクリプト起動なので必要最低限で前者が必須のケースです。マルチスレッド通信はProxyタイプ通信で連携する場合では必須なので他の章を参考にしてください。

ブラウザから以下のようにアクセスができたら成功です。中間証明書がきちんと登録ができていないと今のブラウザは厳しいので「このサイトは安全でない」と表示されるので要注意です。必ず中間証明書とサーバー証明書をマージして区切り線が前後に改行されていることを確認しましょう。



Python Bottle Framework入門 全13回
1.基礎編サーバ起動
2.リクエストメソッド
3.ORM Peewee (MySQL)
4.ORM Peewee CRUD
5.Cookie And Session
6.Abort and Redirect
7.マルチスレッドWEBサーバ
8.デーモン化
9.Json
10.WSGI on SSL
11.Apache連携起動(外部WSGI) SSL接続
12.Apache連携起動(ReverseProxy)SSL接続
13.hprox連携起動(ReverseProxy)SSL接続&HTTP2対応

合わせて読みたいPython MySQL操作関連

タグ: , , , , ,

SEO対策を考慮したホームページ SSL化の導入作業の流れ(手順)


2月の後半にグーグルから本格的モバイルファーストインデックスとオールSSL化に関するアナウンスが出ました。3年ほど前から言われてきたことなのですがいよいよタイムリミットが迫っています。7月24日リリース予定のクロームブラウザversion 68ではhttps対応になっていないと安全ではないサイトということで警告が出るそうです。

6月末までには対応しておくべきでしょう。ついでにそのタイミングでモバイルファーストインデックスを行えば余計な二重投資は防げると思います。逆に一緒にやらないとアノテーション設定のURLがhttpsに変わるので変更を行う手間を考えたらこのタイミングで行うことがもっとも効率が良いという事がわかると思います。


※日本時間で平成30年3月28日にモバイルファーストインデックスが開始されました。逐次MFI導入している企業から置き換えてゆくそうです。MFIになっていない企業は最終的には自動でグーグルの中でMFIに置換されるようです。今年1年かけて置換されるため、最後の方でMFI対応していない会社のHPは置換されるのかもしれません。

アナウンス関連の記事

GoogleオールSSL化の理由はここにあり。
モバイルファーストインデックス
オールSSL化対応

今回はこれらの対応の中でもSSL化に関する対応の流れを説明しておきたいと思います

サイトをSSL化するには、証明書を購入してサーバに導入しなければならないのですが、大変複雑なプロセスが生じます。

また、WEBサーバに証明書を登録しただけではほとんどのサイトはSSL化対応が不十分なケースが多いです。下記のような流れが必要になります。

証明書のインストールの流れ

下記は専用サーバ系で証明書を購入から申請、導入までの手順です。共有サーバの場合はプロバイダーの管理画面で共有SSL、オリジナルSSL設置案内がサイト内にあるはずですからそれをお読みください。

WEBコンテンツ側の修正

専用サーバ、共有サーバで共通で使えるノウハウです。

分析ツールの設定変更

専用サーバ、共有サーバで共通で使えるノウハウです。

  • Google Search Consoleでサイトマップ(httpsの内容に置換後)の送信を行い最新のhttpsURLでインデックスをさせる。
  • Google Search Consoleのhttpsプロパティを新規作成
  • Google Analysticsの管理画面から既存プロパティhttps切り替え、ビューのhttps切り替え
  • Google Analysticsの目標設定にhttpsが影響がないか確認。
  • 分析タグコードを管理する各種ツールにてhttpsに設定変更、再認証を行う

検索エンジンのhttpsアドレスのインデックス反映状況

専用サーバ、共有サーバで共通で使えるノウハウです。

  • 検索エンジンの窓で「site:https://あなたのドメイン」で検索し出力結果を眺めhttpとhttpsの混在割合を確認し進み具合を見る。siteコマンドでhttpsで検索しても結果的に両方(http&https)出力されます。
  • もし、上記の検索結果から表示して欲しくない、あるいはhttpsに切り替わってくれない緊急性の高いものはGoogle Search Consoleの「URLの削除」を実行し新しいインデックス取り込みを促す。

タグ: , , , , ,

https化で出てくる問題(https化した途端にmod_rewriteが効かなくなってしまう)


Google Chromeの7月リリースバージョンでいよいよサイトのALL SSL化が始まる。
これによりhttpに対応していないサイトは「このサイトは安全でない」の画面が出てしまう。今でも
稀に見ることがある画面ですが、あの画面がでてしまったら当然誰もクリックor タップしないでしょう 。

ということでSSL化をしなければ行けないわけだけど、もう一つこれには考慮が必要なことに気づいた。
スマホとPCコンテンツを分離して作成している場合はアノテーション設定が必要だが、モバイルファーストインデックスも
開始宣言(2/21)が出ているし、何よりもアノテーション設定でURLをhttpsに変更しなければならない。

※レスポンシブで制作している場合は気にする必要はありません。WORDPRESSでデバイスプラグインを使っている人も問題なし

ということでSSL化をやってみると色々な新規顧客である特有の問題が出た。
一番ハマったのが、「https化した途端にmod_rewriteが効かなくなってしまう。httpのときにはmod_rewrite使えたのに!」という現象のサーバが幾つかあった。
つまりWORDPRESSなどではカスタムパーマリンクが使えなくなってしまう現象に遭遇しました。

原因を調べるために、約1日考え込み実験をしまくりました。
や~、これは気が付かなかった。httpd.confを普段触らずVirtualHostでサイト定義するから頭がそちらに向かなかった。
なんとhttpd.confを調べたら下記のようになっているではないですか! なるほど、それではTOPからその設定になっていると
下位で設定したコンフィグは無視されますね!

httpd.conf 修正前)

httpd.conf CentOSの場合修正後)

apache2.conf Ubuntuの場合修正後)



apacheを再起動してめでたくmod_rewriteがSSLで使えるようになりました。
上記の設定はDirectoryディレクティブを使用しているため、適切に範囲設定をその環境内で
望ましい設定を厳密には行う必要があります。上記のケースでは”/”でAllowOverride Allにしているためセキュリティを
高くするためにはフォルダーの範囲をもう少し狭めたほうが良い場合もあるので実験して良いバランスの設定を考慮スべきと思います。

他にも、https化で出てくる作業が多いのでメモをしておきます。

https化で遭遇する付帯作業

  • Google Search Consoleにhttpsでサイト登録が必要
  • 旧httpアドレスがインデックスされたり、他サイトと連携している場合はhttpアドレスからhttps転送設定が必要
  • 転送設定をjavascriptでやる場合は注意が必要。コンバージョンが拾えなくなる可能性がある。リファラーを追加する設定が必要かも
  • Google Analysticsの管理画面でプロパティ、ビューのURLをhttpsに切り替える。ビューのコンバージョンURLも変更。
  • sitemap.xmlをhttpsのアドレスになっているかチェック、なっていなかったら作り直し
  • WORDPRESSのプラグイン経由でanalysticsを設定、取得している場合は再設定が必要になる場合が多い

タグ: , , , ,

delegated Reverse Proxy SSL接続 ワンライナーWEBサーバとの連携にどうぞ!


昔からある和製ProxyサーバDelegated Proxy Server。海外のオープンソースがひしめく中で高機能で堅牢なProxyサーバです。他のProxy Serverにはない機能が沢山あり使う度にこんなこともできるんだと感心することもあります。今回の投稿ではこの和製ProxyサーバでSSL接続する方法を紹介したいと思います。


まずはdelegated proxyサーバをダウンロードしましょう。ソースからコンパイルして使うのが良いですね。CentOSというかRedHat系はすんなりコンパイルできますが、Ubuntuは古いバージョンのDelegatedでないと確実にエラーが発生しますので、最新のDelegatedバージョンを入れるならバイナリーをダウンロードして設置しsslwayだけRedhat系でコンパイルしたものを持ってきて使うのが簡単です。当方で確認した限りでは特に問題なくこのやり方でSSLの接続動作しました。何故かsslwayはバイナリーパッケージにはバンドルされていなかった。

Delegated ダウンロード公式ページ(source) Delegated ダウンロード公式ページ (Binary)

※現在の最新は9.9.13でソースからコンパイルするならdelegate9.9.13.tar.gzをダウンロードしてください。

コンパイルの仕方

直接起動スクリプトにパラメータを設定してdelegatedを起動する場合の必要最低限のインストール

Reverse Proxy構成例

起動スクリプトの準備

下記は内部8080ポートで起動しているWEBサーバにproxy転送する場合だ。最近のプログラム言語は自前でWEBサーバが起動できるケースが殆どなので、マルチスレッドで内部WEBサーバを立てローカルホストでListen起動させておけば余計なポート&アドレスへの攻撃から遮断した上で本格的なSSL接続仕様にできる。
Reverse Proxy仕様でSSLを行う場合のメリットは元のサーバのソースコードを弄らなくて良いところ、そして堅牢性に不安がある場合にある一定の防御壁として動作してくれるため通常の外部WSGIサーバ連携などよりもいい場合もある。やはりケースバイケースのSSL接続の方式選択があると思う。

このケースではSSLの証明書は作成時にパスワード無しで処理しているがパスワード付きで証明書を生成しているなら「-pass file:path」or 「-pass pass:password」をsslwayの引数指定で設定すれば問題ない。尚「POODLE」攻撃を防ぐ施策として「-tls1 -tls1_1 -tls1_2 -no_ssl23」の指定を行っている。このパラメータは本サイトで紹介されていないので非公開のスイッチかもしれない。ソースコードから調査して見つけました。ペネトレーションテストでも調査済みで有効なSSLスイッチでした。またCipherSuiteに関しても環境変数(SSL_CIPHER)で指定できることがわかりましたのでご紹介しています。

SSL証明書の指定は-certと-keyが使えるので、もしCA rootの証明書があるならサーバ証明書「-cert」のファイルにサーバ証明書とCA root証明書を結合して設置すればOK。

実行権を付与しdelegatedの起動

タグ: , , , ,

1 2