簡體   English   中英

使用 Kotlin / Java 中的證書和私鑰對 post 請求進行身份驗證的問題

[英]Issues authenticating a post request with a certificate and private key in Kotlin / Java

我有 SSL 所需的 .pem 證書和私鑰。 在 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 中做同樣的事情。 我一直在閱讀以下文章,但在處理私鑰時遇到問題: https : //developer.android.com/training/articles/security-ssl

我相信我必須通過這樣的 KeyFactory 讀取私鑰:

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

如果可能的話,我想避免像這樣處理它: https : //stackoverflow.com/a/8224863/13669284在這一點上我有點迷茫,非常感謝有關此事的任何指導。

對於不允許換行符的基本編碼:使用 java.util.Base64 Basic – 使用 RFC 4648 和 RFC 2045 表 1 中指定的“The Base64 Alphabet”進行編碼和解碼操作。 – 編碼:不添加任何換行(行分隔符)字符。 – 解碼:不包含 Base64 Alphabet 之外的字符。

因此,您可以替換鍵中所有出現的“\\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))
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM