为何部分PKCS#8私钥无法通过Subtle Crypto API导入?
PKCS#8私钥导入Subtle Crypto API失败问题排查
我尝试将从Apple获取的PKCS#8私钥(用于为其Web服务/API签名JWT)导入浏览器的Subtle Crypto API。使用自己的私钥时导入失败,提示Data provided to an operation does not meet requirements,但使用示例中的私钥却能成功。我使用的代码来自MDN相关页面的示例,需要基于原生JS的解决方案,无法使用npm包。
用于导入的代码如下:
async function getPrivateKey() { try { const privateKey = await importPrivateKey(failingPemEncodedKey); //const privateKey = await importPrivateKey(succeedingPemEncodedKey); console.log('privateKey', privateKey); } catch (error) { console.log('ERROR', error.message); } return privateKey; } const failingPemEncodedKey = `-----BEGIN PRIVATE KEY----- MIGTAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBHkwdwIBAQQg/zwtY1nn6uLpYyukIMgEX4pNgp7GQFevZSr9jkMFSR6gCgYIKoZIzj0DAQehRANCAASC0fq/OiBuA2UpHukZHxj88cZJXoesjhxBfO/XAKGlnRFM0QomoF1aoFlkFGvHU/3h53J/dxAwRzNSy++6CyEu -----END PRIVATE KEY-----`; const succeedingPemEncodedKey = `-----BEGIN PRIVATE KEY----- MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQDD0tPV/du2vftjvXj1t/gXTK39sNBVrOAEb/jKzXae+Xa0H+3LhZaQIQNMfACiBSgIfZUvEGb+7TqXWQpoLoFR/R7MvGWcSk98JyrVtveD8ZmZYyItSY7m2hcasqAFiKyOouV5vzyRe87/lEyzzBpF3bQQ4IDaQu+K9Hj5fKuU6rrOeOhsdnJc+VdDQLScHxvMoLZ9Vtt+oK9J4/tOLwr4CG8khDlBURcBY6gPcLo3dPU09SW+6ctX2cX4mkXx6O/0mmdTmacr/vu50KdRMleFeZYOWPAEhhMfywybTuzBiPVIZVP8WFCSKNMbfi1S9A9PdBqnebwwHhX3/hsEBt2BAgMBAAECggEABEI1P6nf6Zs7mJlyBDv+Pfl5rjL2cOqLy6TovvZVblMkCPpJyFuNIPDK2tK2i897ZaXfhPDBIKmllM2Hq6jZQKB110OAnTPDg0JxzMiIHPs32S1d/KilHjGff4Hjd4NXp1l1Dp8BUPOllorR2TYm2x6dcCGFw9lhTr8O03Qp4hjn84VjGIWADYCk83mgS4nRsnHkdiqYnWx1AjKlY51yEK6RcrDMi0Th2RXrrINoC35sVv+APt2rkoMGi52RwTEseA1KZGFrxjq61ReJif6p2VXEcvHeX6CWLx014LGk43z6Q28P6HgeEVEfIjyqCUea5Du/mYb/QsRSCosXLxBqwQKBgQD1+fdC9ZiMrVI+km7Nx2CKBn8rJrDmUh5SbXn2MYJdrUd8bYNnZkCgKMgxVXsvJrbmVOrby2txOiqudZkk5mD3E5O/QZWPWQLgRu8ueYNpobAX9NRgNfZ7rZD+81vh5MfZiXfuZOuzv29iZhU0oqyZ9y75eHkLdrerNkwYOe5aUQKBgQDLzapDi1NxkBgsj9iiO4KUa7jvD4JjRqFy4Zhj/jbQvlvM0F/uFp7sxVcHGx4r11C+6iCbhX4u+Zuu0HGjT4d+hNXmgGyxR8fIUVxOlOtDkVJa5sOBZK73/9/MBeKusdmJPRhalZQfMUJRWIoEVDMhfg3tW/rBj5RYAtP2dTVUMQKBgDs8yr52dRmT+BWXoFWwaWB0NhYHSFz/c8v4D4Ip5DJ5M5kUqquxJWksySGQa40sbqnD05fBQovPLU48hfgr/zghn9hUjBcsoZOvoZR4sRw0UztBvA+7jzOz1hKAOyWIulR6Vca0yUrNlJ6G5R56+sRNkiOETupi2dLCzcqb0PoxAoGAZyNHvTLvIZN4iGSrjz5qkM4LIwBIThFadxbv1fq6pt0O/BGf2o+cEdq0diYlGK64cEVwBwSBnSg4vzlBqRIAUejLjwEDAJyA4EE8Y5A9l04dzV7nJb5cRak6CrgXxay/mBJRFtaHxVlaZGxYPGSYE6UFS0+3EOmmevvDZQBf4qECgYEA0ZF6Vavz28+8wLO6SP3w8NmpHk7K9tGEvUfQ30SgDx4G7qPIgfPrbB4OP/E0qCfsIImi3sCPpjvUMQdVVZyPOIMuB+rV3ZOxkrzxEUOrpOpR48FZbL7RN90yRQsAsrp9e4iv8QwB3VxLe7X0TDqqnRyqrc/osGzuS2ZcHOKmCU8= -----END PRIVATE KEY-----`; async function importPrivateKey(pem) { const pemHeader = '-----BEGIN PRIVATE KEY-----'; const pemFooter = '-----END PRIVATE KEY-----'; const pemContents = pem.substring( pemHeader.length, pem.length - pemFooter.length ); const binaryDerString = window.atob(pemContents); const binaryDer = str2ab(binaryDerString); const privateKey = await window.crypto.subtle.importKey( 'pkcs8', binaryDer, { name: 'RSA-PSS', hash: 'SHA-256', }, true, ['sign'] ); return privateKey; }
我已测试该代码,结果一致。请问我哪里出错了?
内容的提问来源于stack exchange,提问作者Morten Bjerg Gregersen
相关产品推荐
相关产品推荐

