code up

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

XREAのメールサーバー

xrea.comのメールサーバーについて。忘れがちだしGoogleで検索すると古い仕様が出てきてしまうのでメモ。

XREA Mail&Bakcupを契約し、m1.xrea.comサーバーを利用している。s???.xrea.comのサーバーでは異なる点があるかも。

環境はWindows 7 Professional 64bit + Thunderbird 11.0.1 / JavaMail 1.4.5。

まずはXREA.COMの仕様を確認。

  • POP, POP3対応: 110
  • POP over SSL, POP3 over SSL (pops, pop3s)対応: 995
  • SMTP; 587
  • SMTP over SS; 465
  • POP before SMTP, SMTP-AUTH
  • IMAP: 143
  • IMAP over SSL: 993

おそらくSMTPは25番ポートでもアクセスできる。私のプロバイダからは接続できなかったが、EC2インスタンスからは接続できたので。

over SSLで接続

XREAのメールサーバーへのSSL接続は『POPS/SMTPS/IMAPS/FTPSでの正式な証明書の提供開始について』に記載がある通り正式な証明書(認証局により署名された証明書)として設定されている。

m1.xrea.comのサーバーであればm1-xrea-com.value-domain.comが接続先となる。nslookupすればどちらも同じIPアドレスであることが分かる。

SSLの証明書は*.value-domain.comというワイルドカード証明書であった。

ただ、デフォルトのThunderbirdではこの正式な証明書を署名している認証局の中間証明書が入っていないため警告が出る。m1-xrea-com.value-domain.comを接続先としてSSLで設定すると次のような警告が出る。

このサイトでは不正な証明書が使用されており、サイトの識別情報を確認できません。
不明な証明書です
既知の認証局によって検証されていないため、このサイトの証明書は信頼されません。

『次回以降にもこの例外を有効にする』のチェックをはずして『セキュリティ例外を承認』すれば、恒久的にOKだが、これだと正式な証明書としての正しい使い方になっていない。m1.xrea.comにSSLでつないでその証明書を単品で例外許可しちゃうのと結局は同じになる。ちなみに、m1.xrea.comにSSLで接続しようとすると上記の警告メッセージに加え次のメッセージも出る。

このサイトでは不正な証明書が使用されており、サイトの識別情報を確認できません。
他のサイトの証明書です
他のサイト用の証明書が使われています。別のサイトになりすまそうとしている可能性があります。

正式な証明書を正しく使うために、つまりThunderbirdにインストールされているルート証明書からValue-Domainのサーバー証明書までのチェインを認証するために、中間CA証明書をインストールする。サーバー側でインストールできそうなもんだけどしてないようだ。

中間CA証明書あるいは中間CA(認証局)とは、ブラウザ等に搭載されているルート証明書の認証局から認証された証明書あるいは認証局とのこと。そこからさらにサーバー証明書(実際に接続する接続先のサーバー証明書)を認証する。詳しい説明はあちこちにあると思うが、ベリサインのページ等が例えば参考になる。

中間CA自体の歴史とか経緯やら意義・目的は詳しく知らないが、よく見かける理由としては、ルート証明書を外部の攻撃から守り危殆化を防ぐためためだったり、古い端末をサポートするためだったり、らしい。素人考えだけど、サーバー証明書を解析しようとしたらまずは中間証明書を相手にしなくちゃいけないから、ルート証明書に辿り着くまでの時間が稼げるってことかな?偽SSL証明書事件のような事件が起こった際に中間CA証明書が被害をせき止めて被害の拡大を防いでいたのかもしれない(←私見。

中間CA証明書の入手

*.value-domain.comの証明書はDigiCertというところから認証されていた。そのサーバー証明書を証明している中間CA証明書をダウンロードしてダブルクリック(拡張子*.crt)でWindowsの証明書ウィンドウを起動すればその中間証明書がDigiCertのルート証明書から証明されていることが確認できる。

ダウンロードはこちらDigiCert High Assurance CA-3というのを探してダウンロードする。

次にThunderbirdを起動して、メニューバーが出ていなければF10キーを押してから、[ツール]→[オプション]→[詳細]→[証明書]→[証明書を表示]→[インポート]でダウンロードしたファイルを選択する。

その際、『新しい認証局(CA)を信頼するよう求められています。本当にこの認証局を信頼しますか?』と出るので、改めて『証明書を表示』を押して証明書が改ざんされていないか確認。チェックボックスが3つあるが今回はサーバー証明書を検証するのに使うため、どれにもチェックを入れずOKを押す。インストールされると認証局証明書にDigiCert High Assurance CA-3が追加される。これでm1-xrea-com.value-domain.comへのSSL接続で警告が出なくなる。

Thunderbirdは証明されたサーバー証明書を確認する手段はない模様。アドオンも探してみたけど、それっぽいのはなかった。そのメールボックスに鍵マークがつくだけでしか判断できないみたい。

上記XREAのアナウンスではOutlookではエラーが出なくなるとあったけど、おそらくOEはWindowsの証明書ストア(certmgr.mscで確認できる)を参照していて、Windowsが自動的に中間証明書をインストールしているっぽい、Outlook Expressは削除しているので推測だけど。

JavaMailで接続

JavaMailでSSL接続しようとした場合、Thunderbird同様中間証明書がないため次のような例外が出る。

Exception in thread "main" javax.mail.MessagingException: Connect failed;
  nested exception is:
	javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
	at com.sun.mail.pop3.POP3Store.protocolConnect(POP3Store.java:210)
	at javax.mail.Service.connect(Service.java:295)
	at javax.mail.Service.connect(Service.java:176)
	at javax.mail.Service.connect(Service.java:196)
	at Mails.main(Mails.java:97)
Caused by: javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
	at com.sun.net.ssl.internal.ssl.Alerts.getSSLException(Unknown Source)
	at com.sun.net.ssl.internal.ssl.SSLSocketImpl.fatal(Unknown Source)
	at com.sun.net.ssl.internal.ssl.Handshaker.fatalSE(Unknown Source)
	at com.sun.net.ssl.internal.ssl.Handshaker.fatalSE(Unknown Source)
	at com.sun.net.ssl.internal.ssl.ClientHandshaker.serverCertificate(Unknown Source)
	at com.sun.net.ssl.internal.ssl.ClientHandshaker.processMessage(Unknown Source)
	at com.sun.net.ssl.internal.ssl.Handshaker.processLoop(Unknown Source)
	at com.sun.net.ssl.internal.ssl.Handshaker.process_record(Unknown Source)
	at com.sun.net.ssl.internal.ssl.SSLSocketImpl.readRecord(Unknown Source)
	at com.sun.net.ssl.internal.ssl.SSLSocketImpl.performInitialHandshake(Unknown Source)
	at com.sun.net.ssl.internal.ssl.SSLSocketImpl.startHandshake(Unknown Source)
	at com.sun.net.ssl.internal.ssl.SSLSocketImpl.startHandshake(Unknown Source)
	at com.sun.mail.util.SocketFetcher.configureSSLSocket(SocketFetcher.java:548)
	at com.sun.mail.util.SocketFetcher.createSocket(SocketFetcher.java:352)
	at com.sun.mail.util.SocketFetcher.getSocket(SocketFetcher.java:233)
	at com.sun.mail.pop3.Protocol.(Protocol.java:111)
	at com.sun.mail.pop3.POP3Store.getPort(POP3Store.java:261)
	at com.sun.mail.pop3.POP3Store.protocolConnect(POP3Store.java:206)
	... 4 more
Caused by: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
	at sun.security.validator.PKIXValidator.doBuild(Unknown Source)
	at sun.security.validator.PKIXValidator.engineValidate(Unknown Source)
	at sun.security.validator.Validator.validate(Unknown Source)
	at com.sun.net.ssl.internal.ssl.X509TrustManagerImpl.validate(Unknown Source)
	at com.sun.net.ssl.internal.ssl.X509TrustManagerImpl.checkServerTrusted(Unknown Source)
	at com.sun.net.ssl.internal.ssl.X509TrustManagerImpl.checkServerTrusted(Unknown Source)
	... 18 more
Caused by: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
	at sun.security.provider.certpath.SunCertPathBuilder.engineBuild(Unknown Source)
	at java.security.cert.CertPathBuilder.build(Unknown Source)
	... 24 more

Javaの場合CAの証明書はデフォルトでは次の場所にある。JDK, JREをそれぞれ記載しておく。またJDK 6u31のパス。Tomcatの場合でもTomcatにSSLを設定していなければデフォルトのままかな?未確認だけど。

  • C:\Program Files\Java\jdk1.6.0_31\jre\lib\security\cacerts
  • C:\Program Files\Java\jre6\lib\security\cacerts

元に戻したいこともあるかもしれないので、予めバックアップとっておくとよいかも。

DigiCert Trusted Root Authority CertificatesよりDigiCert High Assurance CA-3の中間証明書をダウンロードしておく。

Program Files以下を操作するのでコマンドプロンプトを管理者として実行し、次のコマンドを入力。

"C:\Program Files\Java\jdk1.6.0_31\bin\keytool" -alias digicerthighassuranceca3 -import -file [ダウンロード]\DigiCertHighAssuranceCA-3.crt -trustcacerts -storepass changeit -keystore "C:\Program Files\Java\jdk1.6.0_31\jre\lib\security\cacerts"
証明書がキーストアに追加されました。

各オプションの意味。詳しくはOracleのドキュメント (英語)を、java.sun.comはもう閉鎖したのか日本語のドキュメントは閲覧できず(ダウンロード)。

-alias
別名。ユニークでなければいけない。他のを見ると証明書の名前から付けてる感じ
-import
取り込むことを指示
-file
取り込む証明書ファイルを指定
-trustcacerts
認証局(CA)の証明書を取り込む場合に指定
-storepass
変更していなければchangeitがデフォルト
-keystore
インポート先のキーストアファイル

中身の確認。

"C:\Program Files\Java\jdk1.6.0_31\bin\keytool" -list -v -alias digicerthighassuranceca3 -storepass changeit -keystore "C:\Program Files\Java\jdk1.6.0_31\jre\lib\security\cacerts"

-vオプションは詳細表示するスイッチ。

別名: digicerthighassuranceca3
作成日: 2012/03/28
エントリのタイプ: trustedCertEntry

所有者: CN=DigiCert High Assurance CA-3, OU=www.digicert.com, O=DigiCert Inc, C=US
発行者: CN=DigiCert High Assurance EV Root CA, OU=www.digicert.com, O=DigiCert Inc, C=US
シリアル番号: a5f114d035b179117d2efd4038c3f3b
有効期間の開始日: Wed Apr 02 21:00:00 JST 2008 終了日: Sun Apr 03 09:00:00 JST 2022
証明書のフィンガープリント:
	 MD5:  C6:8B:99:30:C8:57:8D:41:6F:8C:09:4E:6A:DB:0C:90
	 SHA1: 42:85:78:55:FB:0E:A4:3F:54:C9:91:1E:30:E7:79:1D:8C:E8:27:05
	 署名アルゴリズム名: SHA1withRSA
	 バージョン: 3

拡張: 
(以下ダラダラーっと続く)

削除

削除したくなった場合は、次のコマンド。削除しました、というメッセージすらなくてちょっと寂しいけど削除されていた。

"C:\Program Files\Java\jdk1.6.0_31\bin\keytool" -list -alias digicerthighassuranceca3 -storepass changeit -keystore "C:\Program Files\Java\jdk1.6.0_31\jre\lib\security\cacerts"

その他XREAメールサーバーの仕様

telnetで587番ポートに接続してコマンドを打てば、サポートしている認証方式が分かる。

telnet m1.xrea.com 587

220 m1.xrea.com ESMTP
EHLO localhot
250-m1.xrea.com
250-AUTH LOGIN CRAM-MD5 PLAIN
250-AUTH=LOGIN CRAM-MD5 PLAIN
250-PIPELINING
250 8BITMIME

これを見る限り、DIGEST-MD5はサポートしてないみたいだ。

従ってXREAのサーバーからセキュアにメールを送るにはSSL + LOGIN or PLAINでの方法となる。先日書いたAWS - EC2からメール送信でも書いたがJavaMailはCRAM-MD5はサポートしていないのだ。

メール送信クラスでは次のように指定した。XREA以外のメールサーバーへの切り替えが容易となるように作っているためDIGEST-MD5も指定しているが、m1-xrea-com.value-domain.comではLOGINが使われる。

props.setProperty("mail.smtps.auth.mechanisms", "DIGEST-MD5 LOGIN PLAIN");
関連記事
タグ:XREA Value-Domain
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。