最近在和某上市公司對接金融方面的業務時,關於RSA對接過程當中遇到了一個坑,特來分享下解決方案。php
該上市公司簡稱爲A公司,咱們簡稱爲B公司。A-B兩家公司通訊採用HTTPS協議,加密方式選擇RSA非對稱加密+簽名的方式,以保障數據通訊安全,不被篡改。安全
雖然對於數據通訊來講,安全是有了保障。但對於開發來講,卻添了很多的麻煩。麻煩就在於加解密十分繁瑣。oop
A 公司提供了本身的公鑰,以及咱們公司(B)的私鑰。咱們須要將私鑰轉換成pkcs8 的格式。而後從私鑰中,釋放出公鑰。加密
可是在轉換咱們公司(B)的私鑰格式的時候卻出了問題。code
私鑰格式以下:orm
該私鑰爲行文方便,已作修改,非正確私鑰。將該私鑰保存爲test.pemblog
MIICeAIBADANBgkqhkiG9w0BAQEFAASCAmIwggJeAgEAAoGBAIwanpQ5GCOLCjqpx18PJTm2reqMwvmuk8L9XpV/ed04jbrPHJlVAsOgmOxCnEvHQ9ZBfipqUlKu3Wxrx2UYh2OSENrhOKflLawFYP/4uCIr88BoP/OXIl7PnkmxqJbKzsOyp9oZpkpBU1jhWAkAvouAojTWFeJk0b/J0bu3k0C1AgMBAAECgYEAitcuY5EY/NAi+PObIfbuWv1P6GpKJgj9YXSZMOm9KJ+MxJ3Op5z5OkiCg0+Xd/kmnsMUdpAauNmVkIZWeTcPovrhBTQ3/2F6ToBTiv474QEHoBc5TtIKc2xHUmD/h6YpCuPXChC4ctKLAgHImIwB+Az0FUzfclGMbKGPoei/2YECQQDq0XB4lX6ajWq+2UyzA5WgZe6vPZ/YXSF1HRd1Z1uHa8qoPG7KYAlk6ZNpj1LyPOUL0p628WOoItICK0oqTMOxAkEAmL38BwDx1VZAvqyM4XKdWV+J8LlVeWgbPytz92ywxoaD55MvDKInHhdO3abhwqBA7eaGvLrwRVkn66ksX3UiRQJBAK+4aXUjUimwGCiXjmkMDqWIghRLhlmwX8A3M/3ciccOaAp7puD0+zK0BGdjJMw3u6OcSr9WZqBE5mlPIeIDrhECQECz6jlFSyxmN1MOYTd3h/Q+Jn7U48JkOXaO/7cGUfQnM2U70ih14EA8+2mlsejyXc7pYpY8Ul/uHp0TsvpU8kkCQQCfxgnHibKQxH94TKK+CMWiehMqc3oSyeUYLlJazHguZirwUlotLyfDXv8Wams7ZezihHtu53NB2gLmuZ
執行轉碼pkcs8命令ip
openssl pkcs8 -topk8 -inform PEM -in test.pem -outform PEM -nocrypt -out rsa_private_key.pem 而後報錯: unable to load Private Key 139656125785928:error:0906D06C:PEM routines:PEM_read_bio:no start line:pem_lib.c:703:Expecting: ANY PRIVATE KEY
在網上查看資料,發現是沒有加聲明頭和聲明尾ssl
-----BEGIN PRIVATE KEY----- 這裏放置私鑰 -----END PRIVATE KEY-----
可是執行完畢以後,發現仍是報上面提示的錯誤,百思不得其解。無聊的時候,查看A公司提供的私鑰,和正常私鑰的區別。這一比較就比較出了問題。下面是正常私鑰的格式。ci
正常私鑰:
roverliang$ cat private_key.pem -----BEGIN RSA PRIVATE KEY----- MIICdgIBADANBgkqhkiG9w0BAQEFAASCAmAwggJcAgEAAoGBAJ4WOVPo5DrVv/ew iEJMQWYRPBsRkyXG1CXb3PtWKjUbPbLDRSeHhGeuSU4nLGDCBHRv52lLM508CfX8 dDOXhlX3G/FGc/lKjAVhOhoV3+yZWaHJmdhpzwvmADOKho9GXO5JJlSLVlS2mp/g 2OjoV9x5Xktjs30D1NaqKkK4MUppAgMBAAECgYEAkaRz6GRVcAbhNvbCciIC1l/m eiG06UbGyKJIcp2tgQO50emo2oQ1bbfZ/VCFyBa3N/aowg7wXFml66RMAgQFU9bj 8mrbEuJ6ZmtvTkIFVWqpWSQKgewYphcy1VYyn4Z3DMGCCQ346lL3QpLWV0dNEhL3 QcR69qt5ZzshUmrzO+kCQQDO7c2HAq8qkx/L5z6Ggtz3YtbWzTafyuFUv8q5/v/Q btcEAL1RjshF0/qsjbhpwHqFRLLGkptSg7BjUsgrW6cTAkEAw5NTKgDUgICJouay nQbBQujTwvuNLi21ZIQi3i6vAoHu1eVCfpGSnUnsvYmEKtNHZO++o4lBhbIuoI6L gBUMEwJAYMALIp78q5lSepHKSDYTfo92B8S3T4saQ/fQn5o8nYXVfoeh/OoXdZ6h S+CPYtKd9oWiWPnfKXttE2N3N96IhQJAaZM0B66fCCdbJVcIAIBO/4GUHuOQWOdP zk0OTYZB70aY2VqDRLPsw3/OjpqXgE7BcZmB/eHwPu3rAb0xTRkPhQJASGO0f1xw 5emsQQavF1PBXUDhB9FJN1L5aobB7x8bTZUwsd+3Wd36eS5t6ZoopjUpdROyelUc KHENKgdw== -----END RSA PRIVATE KEY----- roverliang$
正確私鑰與錯誤私鑰對比圖以下:
由此咱們得知,錯誤私鑰沒有換行,而正確私鑰是每行的長度爲64個字符。因而我作了一個大膽的假設,使用腳本,強制將私鑰換行,從新整理格式。PHP腳本以下:
處理腳本:
//新建一個腳本,命名爲trans.php <?php $str = "您的錯誤私鑰放在這"; $dataArr = str_split($str, 64); echo "-----BEGIN RSA PRIVATE KEY-----".PHP_EOL; foreach ($dataArr as $trunk) { echo $trunk.PHP_EOL; } echo "-----END RSA PRIVATE KEY-----".PHP_EOL; //執行下命令 /usr/local/bin/php ./trans.php > test.pem
執行正常的pkcs8轉換命令
openssl pkcs8 -topk8 -inform PEM -in test.pem -outform PEM -nocrypt -out rsa_private_key.pem openssl rsa -in rsa_private_key.pem -pubout -out rsa_public_key.pem
而後你會發現,全部的問題都迎刃而解。快樂的寫代碼吧