- 最初にHTTPSのデジタル証明書ファイル(公式証明書...)を取得します
- HTTPSインスタンスを構成します。具体的なコードは次のとおりです。
import java.io.InputStream import java.security。{SecureRandom、KeyStore} import javax.net.ssl。{SSLContext、TrustManagerFactory、KeyManagerFactory} import akka.actor.ActorSystem import akka.http.scaladsl.server。{Route、Directives} import akka.http.scaladsl。{ConnectionContext、HttpsConnectionContext、Http} import akka.stream.ActorMaterializer import com.typesafe.sslconfig.akka.AkkaSSLConfig 暗黙の val system = ActorSystem() 暗黙の val mat = ActorMaterializer() 暗黙の valディスパッチャー= システム。ディスパッチャー // 手動HTTPS設定 valパスワード:Array [Char] =" change me " .toCharArray // パスワードをコードに保存せず、安全な場所から読み取る! val ks:KeyStore = KeyStore.getInstance(" PKCS12 " ) val keystore:InputStream = getClass.getClassLoader.getResourceAsStream(" server.p12 " )
//数字证书是固定的p12文件格式 require(keystore!= null、" キーストアが必要!" ) ks.load(keystore、password) val keyManagerFactory:KeyManagerFactory = KeyManagerFactory.getInstance(" SunX509 ") keyManagerFactory.init(ks、password) val tmf:TrustManagerFactory = TrustManagerFactory.getInstance(" SunX509 " ) tmf.init(ks) val sslContext:SSLContext = SSLContext.getInstance(" TLS " ) sslContext.init(keyManagerFactory.getKeyManagers、tmf。 getTrustManagers、新しいSecureRandom) val https:HttpsConnectionContext = ConnectionContext.https(sslContext)
3.ただし、公式の証明書は受け入れられません。厳しい要件があります
- 対応するドメイン名の証明書(* .a.com証明書はsbcomのサーバーに適用できません。証明書エラーの問題、このサイトの安全でない結果、さらにはデジタル証明書の開示につながる可能性があります)
- 厳格なp12ドキュメント証明書
4.サーバーサーバーはhttpsとhttpの両方を許可できますが、2つの方法は同じアドレスにできないため、一緒に機能し、エラーが報告されます。
サーバーでhttpとhttpsを同時に実行する必要がある場合は、2つのポートアドレスを準備する必要があります。
つまり、単一のアプリケーションでHTTPサーバーとHTTPSサーバーを実行する場合、メソッドを2回呼び出すことができますbind...
。1つはHTTPS用で、もう1つはHTTP用です。
具体的なコードは次のとおりです。
上記の2のhttpsの代用 も必要です// 次のように同じアプリケーションでHTTPとHTTPSの両方を実行できます: val commonRoutes:Route = get {complete(" Hello world!" )} Http()。bindAndHandle(commonRoutes、" 127.0.0.1 "、443、connectionContext = https) Http()。bindAndHandle(commonRoutes、" 127.0.0.1 "、80)