加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

使用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或文件名.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读