我有一些发出HTTP请求的Python代码:

import requests

response = requests.get(
  url,
  cert = tuple(clientCertPath, pkeyPath), // paths to crt.pem and pkey.pem
  verify = serverCertPath // path to server-ca.crt file
)

我想用KTOR把这个重写给Kotlin.这就是我到目前为止想出的:

val serverCert = serverCertPath.inputStream().use {
  CertificateFactory.getInstance("X.509").generateCertificate(it) as X509Certificate
}
val keyStore = KeyStore.getInstance(...).apply { 
  load(null, null)
  setCertificateEntry("serverCert", serverCert)
}
val trustManagerFactory = ... // init with keystore
val sslContext = SSLContext.getInstance("TLS") // and init with above config
val client = HttpClient(Java) {
  engine {
    config {
      sslContext(sslContext)
    }
  }
}

// So far so good. This server certificate config seems to work and cover the 'verify' parameter. Now for the other cert.

val clientCert = CertificateFactory.getInstance("X.509").let {
  clientCertPath.inputStream().use { stream -> it.generateCertificate(stream) as X509Certificate }
}

client.request(url) {
  this.method = HttpMethod.Get
  // how to supply client cert?
}

现在我被困住了.如何将客户端证书应用于请求?无论是客户端级配置还是请求级配置,我都可以.另外,我还没有用过pkeyPath美元.我在哪里做呢?

推荐答案

有几种方法可以加载pem文件并从中创建一个sslContext.然而,使用传统的Java,它有点冗长.如果您只想在不需要附加库的情况下使用它,可以try 下面的堆栈溢出主题How to build a SSLSocketFactory from PEM certificate and key without converting to keystore?

或者,您可以try 我的库,它不那么冗长.您需要做的是加载您的pem文件,并创建一个密钥管理器和信任管理器,您可以使用它们来创建一个sslcontext.KTOR将能够使用该对象.示例代码片段如下:

var keyManager = PemUtils.loadIdentityMaterial("certificate-chain.pem", "private-key.pem");
var trustManager = PemUtils.loadTrustMaterial("some-trusted-certificate.pem");

var sslFactory = SSLFactory.builder()
          .withIdentityMaterial(keyManager)
          .withTrustMaterial(trustManager)
          .build();

var sslContext = sslFactory.getSslContext();

您可以将包含以下代码段的库添加到项目中:

implementation("io.github.hakky54:sslcontext-kickstart-for-pem:8.1.5")

Python相关问答推荐

Django注释:将时差转换为小数或小数

如何将新的SQL服务器功能映射到SQL Alchemy的ORM

给定数据点,制定它们的关系

按照行主要蛇扫描顺序对点列表进行排序

DuckDB将蜂巢分区插入拼花文件

列表上值总和最多为K(以O(log n))的最大元素数

如何从具有多个嵌入选项卡的网页中Web抓取td类元素

Python在tuple上操作不会通过整个单词匹配

如何在箱形图中添加绘制线的传奇?

不理解Value错误:在Python中使用迭代对象设置时必须具有相等的len键和值

2D空间中的反旋算法

优化pytorch函数以消除for循环

如何在给定的条件下使numpy数组的计算速度最快?

运输问题分支定界法&

OR—Tools中CP—SAT求解器的IntVar设置值

使用NeuralProphet绘制置信区间时出错

Flash只从html表单中获取一个值

OpenCV轮廓.很难找到给定图像的所需轮廓

在Python中从嵌套的for循环中获取插值

在Python中控制列表中的数据步长