使用Scala Dispatch发送证书文件
发布时间:2020-12-16 18:32:57 所属栏目:安全 来源:网络整理
导读:我需要能够发送证书文件(.pem,我认为),使用 scala和dispatch发送get请求. 你是怎样做的? 解决方法 基于@sbridges示例中的 Java代码,我使用dispatch提出了以下Scala代码.它创建一个包含您提供的证书的自定义SSL上下文(仅限那些;验证远程主机时此代码不使用受
我需要能够发送证书文件(.pem,我认为),使用
scala和dispatch发送get请求.
你是怎样做的? 解决方法
基于@sbridges示例中的
Java代码,我使用dispatch提出了以下Scala代码.它创建一个包含您提供的证书的自定义SSL上下文(仅限那些;验证远程主机时此代码不使用受信任根证书的默认存储).
class SslAuthenticatingHttp(certData: SslCertificateData) extends Http { override val client = new AsyncHttpClient( (new AsyncHttpClientConfig.Builder).setSSLContext(buildSslContext(certData)).build ) private def buildSslContext(certData: SslCertificateData): SSLContext = { import certData._ val clientCertStore = loadKeyStore(clientCertificateData,clientCertificatePassword) val rootCertStore = loadKeyStore(rootCertificateData,rootCertificatePassword) val keyManagerFactory = KeyManagerFactory.getInstance("SunX509") keyManagerFactory.init(clientCertStore,clientCertificatePassword.toCharArray) val keyManagers = keyManagerFactory.getKeyManagers() val trustManagerFactory = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm()) trustManagerFactory.init(rootCertStore) val trustManagers = trustManagerFactory.getTrustManagers() val context = SSLContext.getInstance("TLS") context.init(keyManagers,trustManagers,null) context } private def loadKeyStore(keyStoreData: Array[Byte],password: String): KeyStore = { val store = KeyStore.getInstance(KeyStore.getDefaultType) store.load(new ByteArrayInputStream(keyStoreData),password.toCharArray) store } } case class SslCertificateData ( clientCertificateData: Array[Byte],clientCertificatePassword: String,rootCertificateData: Array[Byte],rootCertificatePassword: String) 将用于: val certificateData = SslCertificateData(/* bytes from .jks file for client cert here */,"secret!",/* bytes from .jks file for root cert here */,"also secret!") val http = new SslAuthenticatingHttp(certificateData) val page = http(req OK as.String) println(page()) 请注意,这会将证书数据保留在内存中,这不是最安全的方法,并且不必要地占用内存.在许多情况下,它可能更适合在SslCertificateData案例类中存储InputStream或文件名. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |