[英]Imported a public RSA key into nodejs
我正在嘗試將 swift 中生成的公共 RSA 密鑰傳輸到我的 Nodejs 服務器中。 我使用以下代碼生成了 RSA 密鑰。
private var clientPriv: SecKey?
private var clientPub: SecKey?
private init(){
let params: [String: Any] = [
String(kSecAttrKeyType): kSecAttrKeyTypeRSA,
String(kSecAttrKeySizeInBits): 4096
]
SecKeyGeneratePair(params as CFDictionary, &clientPub, &clientPriv)
}
我使用此代碼將密鑰發送到我的服務器
...
guard let clientPub = clientPub else { return }
let key = SecKeyCopyExternalRepresentation(clientPub, nil)! as Data
let pem = exportToPEM(data: key, withLabel: "PUBLIC KEY")
let data = ["clientPub": pem]
var urlRequest = URLRequest(url: url)
do {
try urlRequest.httpBody = JSONSerialization.data(withJSONObject: data)
urlRequest.httpMethod = "POST"
urlRequest.setValue("application/json", forHTTPHeaderField: "Content-Type")
}catch let err {
print(err)
}
let task = URLSession.shared.dataTask(with: urlRequest){ data, response, error in
guard let data = data, error == nil else {
return
}
...
exportToPem 助手看起來像這樣。
public func exportToPEM(data: Data, withLabel label: String) -> String {
let key = data.base64EncodedString(options: [.lineLength64Characters])
var pem = "-----BEGIN \(label)-----\n"
pem += key
pem += "\n-----END \(label)-----\n"
return pem
}
在我的 Nodejs 端,我使用 express 來處理我的請求,並使用 body-parser 來解析請求中的 json 發布數據。 這是我的 Nodejs 接收代碼的樣子。
app.post('/api/init', jsonParser, function (req, res) {
console.log(req.body.clientPub);
CLIENTPUB = crypto.createPublicKey({ key: req.body.clientPub, format: 'pem', type: 'pkcs1' });
console.log(CLIENTPUB);
res.write(JSON.stringify({'server-pub': SERVERPUB.toString()}));
res.end()
});
問題是 function crypto.createPublicKey 不斷拋出錯誤, error:0D0680A8:asn1 encoding routines:asn1_check_tlen:wrong tag
。 我已經嘗試了許多不同的方法來編寫我的密鑰字符串,但無論看起來如何,加密 createPublicKey 只是拒絕接受它。 我曾嘗試將格式保留為每 64 個字節使用 \n 或根本不使用 \n,完全刪除頁眉/頁腳,以及許多其他不同的組合。 我不明白為什么它一直拒絕接受我發送的任何格式。 我也試過只使用 der 格式,但也被拒絕了。
誰能給我任何關於如何讓這個 function 接受我的密鑰格式的建議?
SecKeyCopyExternalRepresentation()
以 PKCS#1 格式導出公鑰,該格式在type
參數為'pkcs1'
的createPublicKey()
調用中在 NodeJS 端正確指定。
但是,PKCS#1 格式的 PEM 編碼密鑰的 header 和頁腳文本是BEGIN RSA PUBLIC KEY和END RSA PUBLIC KEY ,因此在調用exportToPEM()
時,必須在第二個參數中傳遞"RSA PUBLIC KEY"
而不是"PUBLIC KEY"
:
let pem = exportToPEM(data: key, withLabel: "RSA PUBLIC KEY")
BEGIN PUBLIC KEY和END PUBLIC KEY用於 X.509/SPKI 格式的 PEM 編碼公鑰。 這就是錯誤消息wrong tag的意思。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.