在Kotlin/Java中使用证书和私钥对post请求进行身份验证
我有一个.pem证书和私钥,我需要SSL。在Python中,这样做很简单:在Kotlin/Java中使用证书和私钥对post请求进行身份验证,java,kotlin,ssl,Java,Kotlin,Ssl,我有一个.pem证书和私钥,我需要SSL。在Python中,这样做很简单: import httpx import ssl sslcontext = ssl.create_default_context() sslcontext.load_cert_chain( "./public-cert.pem", "./private-key.pem", ) response = httpx.post( url, verify=s
import httpx
import ssl
sslcontext = ssl.create_default_context()
sslcontext.load_cert_chain(
"./public-cert.pem",
"./private-key.pem",
)
response = httpx.post(
url,
verify=sslcontext,
)
但是我想在Kotlin/Java中也这样做。我已经阅读了以下文章,但在处理私钥时遇到了问题:
我相信我必须通过这样的密钥工厂读取私钥:
fun loadPrivateKey(path: Path): PrivateKey {
val keyText = InputStreamReader(FileInputStream(path.toString())).use {
it.readText()
.replace("-----BEGIN PRIVATE KEY-----\n", "")
.replace("-----END PRIVATE KEY-----", "")
}
val encoded = Base64.getDecoder().decode(keyText)
return KeyFactory.getInstance("RSA")
.generatePrivate(PKCS8EncodedKeySpec(encoded))
}
然后把它送到钥匙店。但是,解码会导致错误:
Illegal base64 character a
如果可能,我希望避免这样处理:
在这一点上我有点不知所措,对此问题的任何指导都将不胜感激。对于基本编码,不允许换行字符: 使用java.util.Base64 基本的 –使用RFC 4648和RFC 2045表1中规定的“Base64字母表”进行编码和解码操作。 –编码:不添加任何换行符(行分隔符)。 –解码:不包含Base64字母表以外的字符 因此,您可以替换键中出现的所有“\n”:
fun loadPrivateKey(path: Path): PrivateKey {
val keyText = InputStreamReader(FileInputStream(path.toString())).use {
it.readText()
.replace("\n", "")
.replace("-----BEGIN PRIVATE KEY-----", "")
.replace("-----END PRIVATE KEY-----", "")
}
val encoded = Base64.getDecoder().decode(keyText)
return KeyFactory.getInstance("RSA")
.generatePrivate(PKCS8EncodedKeySpec(encoded))
}
或者使用
.getMimeDecoder()
。PEM格式标准接近MIME标准,但与MIME标准不同。FWIW noteCertificateFactory.getInstance(“X.509”)
处理PEM或“DER”(二进制)(作为流),因此您不需要读取和预解码证书,而不像KeyFactory
只处理已经读取和解码的DER。