![](/img/trans.png)
[英]Java - Using a certificate and private key to make an HTTP POST request
[英]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.