TLS を使用してポート 25 (SSL なし) で JavaMail を使用してメールを送信しようとしていますが、独自のトラストストアを使用しています (元の cacerts トラストストアには必要な証明書が含まれておらず、Java のデフォルトのトラストストアを変更したくないため)。 . システムトラストストアを使用してTLSを使用してメールを送信できるコードを持っています。
mail.smtp.starttls.enable=true
プロパティ、また、設定
System.setProperty("javax.net.ssl.trustStore", ...)
接続が安全に機能するようになったときに正しいトラストストアを指すようにします。通常のポート 25 であるため、 socketFactoryプロパティ (および実装)をセットアップする必要もありません。システムのトラストストアを使用して、ポート 25 で TLS を使用してメールを送信できます。
ただし、システム プロパティを切り替えて正しいトラスト ストアを設定できるようにするのは、特にサーバー上ではちょっとばかげています。一般:システムトラストストア( cacertsファイル、そのコピーを作成してコピーを変更することは問題ありません!)も、現在それをセットアップするために必要なシステムプロパティも変更しない別の解決策を探しています。
私がすでに試したこと:
独自の SSL socketFactoryをセットアップし、独自のキー マネージャーを使用して別のトラストストアをロードします。これは、ポート 25 で送信する必要がない場合に完全に機能しますが、代わりにポート 465 で安全な接続を開始できます。ただし、保護されていないメールサーバーに安全に接続しようとしています。
独自のsocketFactoryをセットアップしようとしていますが、実際の通信には通常のソケットを使用しています。これは基本的に、自分の socketFactory をまったく使用しないのと同じであり、システムの cacerts trustStore ファイルを使用して Java を使用することになります。
cacertsシステム トラストストア ファイルを変更します。これは機能しますが、システムの信頼ストアを変更したくありません。書き込み権限がないか、キーストアのパスワードが変更される可能性があります。
"javax.net.ssl.trustStore"
自分のトラストストア ファイルを指すようにシステム プロパティを変更します。うまく機能しますが、システム プロパティも変更したくありません。なぜなら、私のコードはサーバー上で実行され、そこで実行される他のコードがわからず、プロパティをそのままにしておく必要があるからです。以前の状態を保存して復元しても、変更時にこのプロパティを使用する他のスレッドを実際に保護することはできないため、このソリューションはあまり好きではありません。
要するに、ポート25でメールサーバーへの安全でない接続を使用し、TLSをオンにして(メールプロパティを設定することにより)、これにより接続が内部的に保護され、独自のトラストストアファイルを使用する方法を知っている人はいますかcacerts やシステム プロパティを変更せずに? おそらく、非安全な接続が安全になったときにのみ使用される socketFactory プロパティと同様の方法がありますか?