Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Kotlin/Java中使用证书和私钥对post请求进行身份验证_Java_Kotlin_Ssl - Fatal编程技术网

在Kotlin/Java中使用证书和私钥对post请求进行身份验证

在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

我有一个.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=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 note
CertificateFactory.getInstance(“X.509”)
处理PEM或“DER”(二进制)(作为流),因此您不需要读取和预解码证书,而不像
KeyFactory
只处理已经读取和解码的DER。