Skip to content

Commit dbdaa46

Browse files
authored
Merge pull request #315 from skydudie/enhancement/decrypt-pkcs8-private-keys
Enhancement/decrypt pkcs8 private keys
2 parents 643cced + 8047b37 commit dbdaa46

File tree

3 files changed

+82
-0
lines changed

3 files changed

+82
-0
lines changed

src/Component/KeyManagement/KeyConverter/KeyConverter.php

+9
Original file line numberDiff line numberDiff line change
@@ -182,6 +182,15 @@ private static function loadKeyFromPEM(string $pem, ?string $password = null): a
182182
if (!extension_loaded('openssl')) {
183183
throw new RuntimeException('Please install the OpenSSL extension');
184184
}
185+
186+
if (1 === preg_match('#BEGIN ENCRYPTED PRIVATE KEY(.+)(.+)#', $pem)) {
187+
$decrypted = openssl_pkey_get_private($pem, $password);
188+
if (false === $decrypted) {
189+
throw new InvalidArgumentException('Unable to decrypt the key.');
190+
}
191+
openssl_pkey_export($decrypted, $pem);
192+
}
193+
185194
self::sanitizePEM($pem);
186195
$res = openssl_pkey_get_private($pem);
187196
if (false === $res) {

tests/Component/KeyManagement/CertificateTest.php

+20
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,26 @@ public function certificateConversion(): void
7979
]);
8080
}
8181

82+
/**
83+
* @covers \Jose\Component\KeyManagement\KeyConverter\KeyConverter
84+
* @test
85+
*/
86+
public function certificateConversionPkcs8(): void
87+
{
88+
$details = KeyConverter::loadFromKeyFile(__DIR__.'/Keys/RSA/pkcs8.private.encrypted.key', 'tests');
89+
static::assertEquals($details, [
90+
'kty' => 'RSA',
91+
'n' => 'w6o04pb9gWvXwne6hNWYMjEqIVpKxsPSZbZWPX1TvhBnHwxj0WV6i9jiuc0zoelBf9nNtfWSS-87XcpLILh0N5UuVwx1HAuD3oBeDw0JereA8VUHeyNJlCle8LaeI0zx4v_YEoOv7sZ4bOx3sLgDSp6rp5N0mnD0oSt6p_bsk-TvCnNW4-1ip8tCwfBCNDpNeX9SViJ3Msy2WmOLHxtdc32r1SurO6WK7mbmqSCwnskcf5ylKupApE_1JO_EwUAEkEJG_RFQhBUGeQitrmdm_wcP0-I4qb23q__DC31CnV1UU4VkpqjTmzbnQdeoXMip9Mvv2S-1Xh1ag7x1tUpxTutCFn3lRXHydzzRPf5SojRcPA9fZWdyLVvj_iFPj0k-Lh5Ru8vA5Qq01OuvIdQDLJkhgVcvlqtycBXE2QqqdzNGhfv-rLjt_GzL-lTotS7cvocueA3gjSOQQiI37YEaI_hPr3P5ta9UK0amwZmbK1cpSxPNqpY6g_VeWGd7CvdjFc-SHsJbuWobvSaqmdPbAWyyQcCfFQkyJHKxOMBovUmHnCtUbgs88UvD9Cs9CZFUZ7y2cEdkfUZE6avZ5M1BwXkRxi2gg0hQyEIkfi3jxG7YAEG2YXSaJvPRw9b00DdF3gFRVN4iJ1fxeMhBFriEaULuCnKBZiC75lrOra1f70s',
92+
'e' => 'AQAB',
93+
'd' => 'VbEPZEU4VRwD7Fk_SLm65BCAIQdIRHCyjnUio99lc5H_d6uXc7d7yg98jF8AQ-LCGtoqq4wXPEZTu6nC6VufGlCtcNY128h3QlT53KGbCzGeuRLCKf20Vb0gpU91RoSGUyI1YTZnMK2fRCTz7mNInb-L8eI0aQcbPBKsry8HQWY8AlmtLjliwZXVcNZmSDVYhONsDekeRxM8sa1y2nbDoLbjMILlhUPk6rAKSPvWHlR5tLHH7FmXYd7awAh6JSCCXyOHr4GLv6ztnshcOEt04jAXkHY81qoN7LgglcGQERc0vTdoc0zxD8Ml2MI4LBp9xIYkTvwD9GnqoFNDQdiOcntVk9MR7N1yrs-dLHg0_psD2vZWRrc00FExLjfzh-RG8kYBnuBocC819MBquchWf9kx3vhQiiuUAVx1rqe9vdlBCnFMyVSjO12La0U_LvoJL0lxWIxJg_AkrZnNNYILGFyP2skdVwN5BkrihU4SGBzG8tyNRknkPTcRT4idKZamnx_tINwyGMSlm1QPKq7yKASu6xGXWFaMZaxfqGfFg1VBntwPH-8FIyQ6HlvQ5sMErR7fPjoI7V8wcTwjpfhzftT4BDf3ml95zrSx9wHxGlOD0gdPnGCLUR64QOVQp7LErRvw8sjX9NVkyPeBY4gKdoW3RnbvBRgRKtOJTYjHW7E',
94+
'p' => '7bBpNdrjGRvjq43Pow8g1zRYDEqG9zSYjrqDzpiAW2BTMUg-JfvVNaPpyzJ0YSdoQt6bvXMmjFhxOidXGLrWQEzIIN_6vz2SdDLCM8hCuFMZcKyjCBZDfdsEUD8DI1sOrIZrDPvkUe4y5JFtVcJ7z2r6Q1lXyQQACYpNKqNz9AJbdnKNalXAe_86tbdV-JLdV4sB-RcQw6ojJC_-rGnIEfHGA_N5VpFAwtKPsA3NN1H-LNRR6rnS68vMCKLgCu2JUEsTUiBRXjS6gLZhQupmDQFP60fPmz5DM4jS0YyQViLHRI_UCtkc9qsBi2nNvnIkBbutIdnxmYk8S2Pj8TYzhw',
95+
'q' => '0r0DmJVh1dYgz1LXwHLFIda5zfKOXbp5Ak6tIoSKiKAzUy5fdu6aNV_xeVzsWwGC8Z5--V9ezJ1nOgZn3s9F-1oJU9b6mdaEVFW2ECiGpTOiPvod96lbGKvletL6rV87wkR3Lgg3beqZ9wJvv7RPtkZIphGmvTUGXMJOnUC-9IjLjrCkHa7XNXGwQN8DA0AWUllJzNNd9uSIBBawQ1uZ4JQa7Iwtt1rO-Rmc8MhI5IxNc9-lp8rDHLfL4O2cvfacA9M6gFkExgVO3I507wpQFoqFyGMn56sKvuYsWxJUk8SrvJO0k5z5NRMtS2ltLRt4WD3eZHWdPmEALZlD-ztfHQ',
96+
'dp' => 'OugHixNOSQDCcdfZZ73uE6ejUph9znI4hNbwp5jf5sV-mK4gyOUauAqBfJxqf1F242usCU2qdgnNNe5eBYD4bEMbLhqUWCT4UNfrjU3KS0g8-9GtLenmnCBVd1XGf1Kn1lYR3cvnj-6Kql7oS-LBMGyAzYQs32KgZ7zg1vpfWE_lPvuw1HOgGprsf_CJ2-r59CI9QPBYdUWLJALJCQ3GSbwzqPMEVVH2TNJGTgl9nIIzjgSosJWREmMVk-ZZxBuOdlnE1guwXrqOpiuM-zqARCTZG6RWbVEG8pSsOsatVsuTuwgyMuYP6YoD_fsgxFwhVVJn3AXZfIWobb651SPrrQ',
97+
'dq' => 'LpL_fHVnTe8pCSjx7eJvlu7x2YZF2IkhvVTOBtbsFw3wye1xw8Mv6aPupjfXNLW8ztGMlmhxdx9CdRx9UEzW1porfZABioZScKEQv7l1KIWk0e5NOTMAow86hE6kgDSP7HtdK5s9RNmYdXLgZ6neBBa8b5dvFlnlshJvdWmdykWBV2PKoZTGk1Uw8uVWsR000bZSDSaZmbsgJGcvRXO1KmERIj5IzEERhRQYD070bS5k37sJzW-Od4ZXVLqu7XzXNjE0uLDz0R_TMgN57GqHELREpOjlJNo0YcRVATun3ZCVs_Og8Q68NPKsDAKc0l9D1Zy2zdUAj4y4kVtSHvAcMQ',
98+
'qi' => 'orWugvZwWMTA6W2LyGIytxYqwfJFZ4ZNZdgRzwOPdadvFUVpebgNr-T_szQOPED9eP2LcgimbGtom_bZ7k7IrwzTV-Jc9GW4JBRQPtOHvzdtvZ1l1XQQVgzcnxzYMCtjof5PfOqjw4y2QdqR3GbRxZgQuQzjbTuQ7oALPgYrQOTQnPNcd7sm4_smxAB1i-S4WCn64CaiXxYmnIPMUVxkemAHSC3dd71XnQS8BRuUox_zIz0X_LDKK2KPshJ9xm6R3hnFq6jWevoZ6Pr7Yege73QiEg7Hipbk54xW0zaNN58B8cCTEckBMkwl6vmILplmpwQevqqHPw7fj8DuBU2C-w',
99+
]);
100+
}
101+
82102
/**
83103
* @dataProvider dataLoadCertificate
84104
* @covers \Jose\Component\KeyManagement\KeyConverter\KeyConverter
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
-----BEGIN ENCRYPTED PRIVATE KEY-----
2+
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
52+
JO4IuqB7J3BoU0Ub6hc=
53+
-----END ENCRYPTED PRIVATE KEY-----

0 commit comments

Comments
 (0)