TLSを使用するが、独自のトラストストアを使用してポート25(SSLなし)でメールを送信しようとしています(元のcacertsトラストストアに必要な証明書が含まれていないため、 Java)。 私はときに、正しいトラストストアを指すようにJavaMail:別のトラストストアを使用できるポート25のTLSは可能ですか?
System.setProperty("javax.net.ssl.trustStore", ...)
を設定し、また、
mail.smtp.starttls.enable=true
プロパティを設定することにより、システムのトラストストアを使用してTLSを使用してメールを送信することができ、コードを持っています接続は安全な作業になります。通常のポート25以降は、socketFactoryのプロパティ(および実装)も設定する必要はありません。システムトラストストアを使用してポート25でTLSを使用してメールを送信できます。
しかし、適切なトラストストアを設定できるようにするためのスイッチングシステムのプロパティは、他のコードがメールを送信したいと思うものがわからず、おそらくサーバーのプロパティを使用する必要がある私はシステムトラストストア(cacertsファイルをコピーしてコピーを修正しても大丈夫です!)を変更するのではなく、現在セットアップするために現在必要なシステムプロパティも、別の解決策を探しています。 SocketFactoryの自分のSSL を設定し、別のトラストストアをロードするために自分のキーマネージャを使用して
:
私はすでに試した何。これは、ポート25で送信する必要がないときに完全に機能しますが、代わりにポート465で安全な接続を既に開始できました。しかし、私はそれを行うことはできません。保護されていないメールサーバーに確実に接続しようとしています。
実際の通信には通常のソケットを使用していますが、自分で設定しようとしています。socketFactoryこれは基本的に私自身のsocketFactoryを全く使わない場合と同じで、システムのcacerts trustStoreファイルを使ってJavaで終わります。
cacertsシステムトラストストアファイルを変更します。これは動作しますが、システムのトラストストアを変更する必要はありません。書き込み権限がないか、キーストアパスワードを変更するなどの可能性があります。
"javax.net.ssl.trustStore"
システムプロパティを変更して自分のトラストストアを指すように変更します。ファイル。うまく動作しますが、私のコードはサーバー上で動作し、他のコードがそこで実行されているかわからず、プロパティもそのまま必要とするため、システムプロパティも変更したくありません。以前の状態を保存して復元しても、変更された時点でこのプロパティを使用している他のスレッドに対して実際には保護されていないので、私はこの解決策が本当に気に入らない。要するに
..だから:誰もが私は(メールプロパティを設定することによって)TLSに切り替えて、ポート25上のメールサーバーへの非安全な接続を使用することができますどのように解決策を知っている、これは内部的に確保cacertsやシステムプロパティを変更せずに自分のトラストストアファイルを使用していますか?おそらく、安全でない接続が安全になったときにのみ使用されるsocketFactoryプロパティと同様の方法がありますか?
...非SSL工場のためのもう一つ、SSLのための1 ...渡すことができる2つのSocketFactoryのプロパティがあります...それを見つけましたあなたの問題のために見つけた答えに。あなたはそれを共有できますか?ありがとう、 Valentin –
すべてのプロパティを表示するcom.sun.mailのパッケージ概要を見てください。基本的には、 "mail.smtp.socketFactory.class"と "mail.smtp.ssl.socketFactory.class"にSSLと非SSL通信のファクトリを設定することができます。 TLSは初めからSSLにすることができます。私の場合、始めは非SSLでしたが、通信が確立されるとSSLに切り替えました。これをシステム全体だけでなくスレッドごとに行うには、独自のPropertiesインスタンスをSession.getInstance(Properties)に渡し、それに応じてプロパティを設定する必要があります。 – Fuggly