如何在RoR上执行此操作,但只获取pem字符串。
openssl pkcs8 -inform DER -in file.key -passin pass:xxxxxxxx >private_key.pem
我想尝试这个解决方案:Load PKCS#8 binary key into Ruby
但RSA.new返回我既不是PUB密钥也不是PRIV密钥:嵌套asn1错误
Ruby代码:
def get_pem(key_file, passphrase)
pem = der_to_pem('PRIVATE KEY', File.read(key_file))
key = OpenSSL::PKey::RSA.new(pem, passphrase)
end
def box(tag, lines)
lines.unshift "-----BEGIN #{tag}-----"
lines.push "-----END #{tag}-----"
lines.join("\n")
end
def der_to_pem(tag, der)
box tag, Base64.strict_encode64(der).scan(/.{1,64}/)
end
这里是调用openssl工具之前每个函数的输出:
功能:der_to_pem 标签:私钥 DER:
0\x82\u0002\xC60@\u0006\t*\x86H\x86\xF7\r\u0001\u0005\r030\e\u0006\t*\x86H\x86\xF7\r\u0001\u0005\f0\u000E\u0004\b\u0002\u0001\u0000\u0002\x81\x81\u0000\xA4\u0002\u0002\u0004\u00000\u0014\u0006\b*\x86H\x86\xF7\r\u0003\a\u0004\b0\x82\u0002v\u0002\u0001\u00000\u0004\x82\u0002\x80\xFE[J\x92\xED˺\xA5u*V\xBD\xF10\vߝ\xF4\xEF\x99\xD63<xׇ\x82\u0001㙶\xB7\xAE\x88J\u001C\xCFi\n\xCD\xCE?*\xCBPD\r\xAA+G\xFB\u00180~2</\x9E\x8C\x87\xE6?ꋹ@\xB1\xB0\u0590H\xF2\xDC\xF5F$\xA4\xC3\xF9䳹\u007F{*\xE0\"\x9C\x82\x82\f)T\u001C\x84\xE7\xEFQl\xC5\xCF^\x91\xC65\x88\x92\f\u0019n\xC7y\xB4|\xA3`\xC0\x8C\xC1\x96S7Nf\xC5\xD0\r\xFA\xBFG\u0015\xB1\x81\xF5p%\u0012T2\x95\xFE2Z\xD7\xED\xE12\u0001\a\xACN\xA6#\xBE\x94\xA1\x97'<\x9C\xB2ҾI\xF1io\xBF\xD1\xE0\xB6\u001A\u0010o\u0015\xEB'F~\xAC\xC3eG\xBF\xF2\x84\x88\xD9\u001C\u000E\xED\u0013s\x91jTnU\u0379[\x9C?\xB3ܮ\xD4\u0016n\xAE?\xD0\u0001\xB0\u0016)SMd\xF2\u0002q\xBB\xC5;\x83\u0019+\x90\u0018\u007Fܳ\xA4\xC4\u001Cs\xFA\u0013\xA1\xA3;d\ekUT\x98/wd\u001E\x9Er\xD4\u0002\xE6\xEBB'$\u0014\xBF\b\xF3\xDC\xCFe,;\x97\x9CӒ\xC1\u0000\x9F\xFDu#\xA4\u007F\r\u0016D 1\xEA\f^\xD0ű\r'ܝ\xDF\xF7\xCE\xCE+{\x96^ь\b_\u0012\xDC\xD8x9}\u0005Rq\xB9\xCC\xFE\xFEvd\xB7\u00108\xC8\xE1\xE5\xD4\xC4i\x9D\xDA(\u0005[\xC0_t\xF5\e\u0018\xBB\u001D\xEC\xAE\xC7\xE8\x8A(\x90w\xCF\xFEcl[\xC2\a3\xB2 ~^\xC4\u001D\u000F\xACl\u0011M\xE4\xA1\xF2Y\u0004o,\xAEl\xC1\u000F$\u0013qSc\x99\u001A\xD2$|\xBC\xAB\x90\xE7\xF0\xF7f\xDFȿ\u0016;lA_\x85\xCA\u000F\x9B#~d\xF2\x9C\u0013*\xA9=Jl\x81t\x85\x96*l\xA8(kt\xD4\u0019\xB4\xB8\u0001U7\xEC\xE9.#;\xA0\u000F\u0003\x91\u0004-\n/P\xDC\xCC\u001A\xA5\xDD\xDA\xE4\u001F\xF2\\\xF1ʗ,E\"0\x93\xD7\xD9\xD1\u001F\x84G_C\xCC\xC23~\xBDC\xA7ab\xBD\xBC\x83ʱ\xE3\xE0\x8F ^\xC0\xDF~\xB5\xBAT\xE8ގ\xFE\xC3\xE5\xCF\xEB\xAC\xE3|n\x8B\u000E&%ʍqk\xAD=\x86\u0005\xD4\xD9+\xF4\xA6\u0000d!\x95b\xEDuY\xAE\xE5jG0\x85\xDE\"\xADc\xACK\x833\xA5lP#\u0000=G\xB3\xCE\xF6\xC0[ԙU\xD5\e:{\u00100\x9B{\x95\x9C@ \xB3\x86\xC2@S\u0015~p؛\u0013\xF48[\xBE\b\e\u007F\xD7x)\u0010\xD7\u001A\xDE\xF2\x9E\xA5X\x8A\u007FV\xF3\xECޱ\xC9\acl\u0004B\x8F\xD3c\x80\xE1\u0016BI\xED\xAA}
der(base64):
功能:框 行:
0\x82\u0002\xC60@\u0006\t*\x86H\x86\xF7\r\u0001\u0005\r030\e\u0006\t*\x86H\x86\xF7\r\u0001\u0005\f0\u000E\u0004\b\u0002\u0001\u0000\u0002\x81\x81\u0000\xA4\u0002\u0002\u0004\u00000\u0014\u0006\b*\x86H\x86\xF7\r\u0003\a\u0004\b0\x82\u0002v\u0002\u0001\u00000\u0004\x82\u0002\x80\xFE[J\x92\xED˺\xA5u*V\xBD\xF10\vߝ\xF4\xEF\x99\xD63<xׇ\x82\u0001㙶\xB7\xAE\x88J\u001C\xCFi\n\xCD\xCE?*\xCBPD\r\xAA+G\xFB\u00180~2</\x9E\x8C\x87\xE6?ꋹ@\xB1\xB0\u0590H\xF2\xDC\xF5F$\xA4\xC3\xF9䳹\u007F{*\xE0\"\x9C\x82\x82\f)T\u001C\x84\xE7\xEFQl\xC5\xCF^\x91\xC65\x88\x92\f\u0019n\xC7y\xB4|\xA3`\xC0\x8C\xC1\x96S7Nf\xC5\xD0\r\xFA\xBFG\u0015\xB1\x81\xF5p%\u0012T2\x95\xFE2Z\xD7\xED\xE12\u0001\a\xACN\xA6#\xBE\x94\xA1\x97'<\x9C\xB2ҾI\xF1io\xBF\xD1\xE0\xB6\u001A\u0010o\u0015\xEB'F~\xAC\xC3eG\xBF\xF2\x84\x88\xD9\u001C\u000E\xED\u0013s\x91jTnU\u0379[\x9C?\xB3ܮ\xD4\u0016n\xAE?\xD0\u0001\xB0\u0016)SMd\xF2\u0002q\xBB\xC5;\x83\u0019+\x90\u0018\u007Fܳ\xA4\xC4\u001Cs\xFA\u0013\xA1\xA3;d\ekUT\x98/wd\u001E\x9Er\xD4\u0002\xE6\xEBB'$\u0014\xBF\b\xF3\xDC\xCFe,;\x97\x9CӒ\xC1\u0000\x9F\xFDu#\xA4\u007F\r\u0016D 1\xEA\f^\xD0ű\r'ܝ\xDF\xF7\xCE\xCE+{\x96^ь\b_\u0012\xDC\xD8x9}\u0005Rq\xB9\xCC\xFE\xFEvd\xB7\u00108\xC8\xE1\xE5\xD4\xC4i\x9D\xDA(\u0005[\xC0_t\xF5\e\u0018\xBB\u001D\xEC\xAE\xC7\xE8\x8A(\x90w\xCF\xFEcl[\xC2\a3\xB2 ~^\xC4\u001D\u000F\xACl\u0011M\xE4\xA1\xF2Y\u0004o,\xAEl\xC1\u000F$\u0013qSc\x99\u001A\xD2$|\xBC\xAB\x90\xE7\xF0\xF7f\xDFȿ\u0016;lA_\x85\xCA\u000F\x9B#~d\xF2\x9C\u0013*\xA9=Jl\x81t\x85\x96*l\xA8(kt\xD4\u0019\xB4\xB8\u0001U7\xEC\xE9.#;\xA0\u000F\u0003\x91\u0004-\n/P\xDC\xCC\u001A\xA5\xDD\xDA\xE4\u001F\xF2\\\xF1ʗ,E\"0\x93\xD7\xD9\xD1\u001F\x84G_C\xCC\xC23~\xBDC\xA7ab\xBD\xBC\x83ʱ\xE3\xE0\x8F ^\xC0\xDF~\xB5\xBAT\xE8ގ\xFE\xC3\xE5\xCF\xEB\xAC\xE3|n\x8B\u000E&%ʍqk\xAD=\x86\u0005\xD4\xD9+\xF4\xA6\u0000d!\x95b\xEDuY\xAE\xE5jG0\x85\xDE\"\xADc\xACK\x833\xA5lP#\u0000=G\xB3\xCE\xF6\xC0[ԙU\xD5\e:{\u00100\x9B{\x95\x9C@ \xB3\x86\xC2@S\u0015~p؛\u0013\xF48[\xBE\b\e\u007F\xD7x)\u0010\xD7\u001A\xDE\xF2\x9E\xA5X\x8A\u007FV\xF3\xECޱ\xC9\acl\u0004B\x8F\xD3c\x80\xE1\u0016BI\xED\xAA}
----- BEGIN PRIVATE KEY ----- MIICxjBABgkqhkiG9w0BBQ0wMzAbBgkqhkiG9w0BBQwwDgQIAgEAAoGBAKQCAgQA MBQGCCqGSIb3DQMHBAgwggJ2AgEAMASCAoD + W0qS7cu6pXUqVr3xMAvfnfTvmdYz PHjXh4IB45m2t66IShzPaQrNzj8qy1BEDaorR / sYMH4yPC + ejIfmP + qLuUCxsNaQ SPLc9UYkpMP55LO5f3sq4CKcgoIMKVQchOfvUWzFz16RxjWIkgwZbsd5tHyjYMCM wZZTN05mxdAN + r9HFbGB9XAlElQylf4yWtft4TIBB6xOpiO + lKGXJzycstK + SfFp B7 / R4LYaEG8V6ydGfqzDZUe / 8oSI2RwO7RNzkWpUblXNuVucP7PcrtQWbq4 / 0AGw FilTTWTyAnG7xTuDGSuQGH / cs6TEHHP6E6GjO2Qba1VUmC93ZB6ectQC5utCJyQU vwjz3M9lLDuXnNOSwQCf / XUjpH8NFkQgMeoMXtDFsQ0n3J3f987OK3uWXtGMCF8S 3Nh4OX0FUnG5zP7 + dmS3EDjI4eXUxGmd2igFW8BfdPUbGLsd7K7H6IookHfP / MNS W8IHM7Igfl7EHQ + sbBFN5KHyWQRvLK5swQ8kE3FTY5ka0iR8vKuQ5 / D3Zt / IvxY7 bEFfhcoPmyN + ZPKcEyqpPUpsgXSFlipsqChrdNQZtLgBVTfs6S4jO6APA5EELQov UNzMGqXd2uQf8lzxypcsRSIwk9fZ0R + ER19DzMIzfr1Dp2FivbyDyrHj4I8gXsDf frW6VOjejv7D5c / rrON8bosOJiXKjXFrrT2GBdTZK / Sm7p6jAGQhlWLtdVmu5WpH MIXeIq1jrEuDM6VsUCMAPUezzvbAW9SZVdUbOnsQMJt7lZxAILOGwkBTFX5w2JsT 9Dhbvggbf9d4KRDXGt7ynqVYin9W8 + zesckHY2wEQo / TY4DhFkJJ7ap9 ----- END PRIVATE KEY -----