จะลบรหัสส่วนตัวของคีย์ออกจากคอนเทนเนอร์ pkcs12 ได้อย่างไร


40
  1. ฉันดึงใบรับรองโดยใช้คำสั่ง SSL / ส่งออกของ Chrome
  2. จากนั้นให้มันเป็นอินพุตสำหรับ openvpn - ใน config สำหรับ openvpn:
    pkcs12 "path/to/pkcs12_container"
  3. เมื่อโทรopenvpn ~/openvp_configมันจะถามรหัสผ่านสำหรับกุญแจส่วนตัว (ที่ฉันป้อนเมื่อส่งออกโดยใช้ Chrome):
    Enter Private Key Password:...
  4. ฉันต้องการลบคำขอรหัสผ่านนี้

คำถาม: วิธีการลบรหัสผ่านสำหรับคีย์ส่วนตัวจาก pkcs12?

นั่นคือสร้างไฟล์ pkcs12 ซึ่งไม่ต้องการรหัสผ่าน

(ดูเหมือนว่าฉันทำไปแล้วเมื่อปีที่แล้วและตอนนี้ก็ลืมไปเลย)


สคริปต์ต่อไปนี้ทำสิ่งนี้ (ที่สำคัญคือไม่มีคำตอบที่ 0): gist.github.com/5nizza/7ae9cff0d43f33818a33การใช้งาน:./remove_pass_from_cert.sh YourCertName YourCertPass
Ayrat

คำตอบ:


48

มันสามารถทำได้โดยการopensslโทรที่หลากหลาย

  • PASSWORD เป็นรหัสผ่านปัจจุบันของคุณ
  • YourPKCSFile เป็นไฟล์ที่คุณต้องการแปลง
  • NewPKCSWithoutPassphraseFile เป็นไฟล์เป้าหมายสำหรับ PKCS12 ที่ไม่มีข้อความรหัสผ่าน

ก่อนอื่นดึงใบรับรอง:

$ openssl pkcs12 -clcerts -nokeys -in "YourPKCSFile" \
      -out certificate.crt -password pass:PASSWORD -passin pass:PASSWORD

ประการที่สองปุ่ม CA:

$ openssl pkcs12 -cacerts -nokeys -in "YourPKCSFile" \
      -out ca-cert.ca -password pass:PASSWORD -passin pass:PASSWORD

ตอนนี้คีย์ส่วนตัว:

$ openssl pkcs12 -nocerts -in "YourPKCSFile" \
      -out private.key -password pass:PASSWORD -passin pass:PASSWORD \
      -passout pass:TemporaryPassword

ตอนนี้ลบข้อความรหัสผ่าน:

$ openssl rsa -in private.key -out "NewKeyFile.key" \
      -passin pass:TemporaryPassword

รวบรวมสิ่งต่าง ๆ สำหรับไฟล์ PKCS ใหม่:

$ cat "NewKeyFile.key"  \
      "certificate.crt" \
      "ca-cert.ca" > PEM.pem

และสร้างไฟล์ใหม่:

$ openssl pkcs12 -export -nodes -CAfile ca-cert.ca \
      -in PEM.pem -out "NewPKCSWithoutPassphraseFile"

ตอนนี้คุณมีไฟล์คีย์ PKCS12 ใหม่โดยไม่มีข้อความรหัสผ่านในส่วนของคีย์ส่วนตัว


คำตอบที่น่ากลัว! .. อะไรนะca-cert.ca?
Ayrat

@Ayrat: นี่คือส่วนใบรับรอง CA ของคีย์ของคุณ - ฉันพิมพ์ผิดในคำตอบแก้ไข ...
อัปโหลด

2
-nodesจะถูกละเว้นเมื่อ-exportมีการใช้งาน แต่จะไม่มีการบันทึกไว้สำหรับกรณีนี้ (ดูที่หน้า openssl -nodesจะแสดงเฉพาะเมื่อส่งออกจาก PKCS # 12 ไปยัง PEM) การโทรครั้งสุดท้ายของคุณยังแจ้งให้ฉันใส่รหัสผ่านการส่งออก และหากฉันเพิ่งกลับมาฉันจะได้รับไฟล์ PKCS # 12 ซึ่งรหัสผ่านเป็นสตริงว่างเปล่าและไม่มีไฟล์ที่ไม่มีรหัสผ่าน เมื่อฉันทำopenssl pkcs12 -in "NewPKCSWithoutPassphraseFile"ยังคงพร้อมท์ให้ฉันใส่รหัสผ่านการนำเข้า ฉันสามารถกดปุ่มย้อนกลับและใช้งานได้ แต่ถ้าไม่มีรหัสผ่านจะไม่แจ้งให้เลย
Mecki

35

ทางออกที่ง่ายที่สุดที่ฉันพบคือ

ส่งออกไปยังไฟล์ pem ชั่วคราว

openssl pkcs12 -in protected.p12 -nodes -out temp.pem
#  -> Enter password

แปลง pem กลับเป็น p12

openssl pkcs12 -export -in temp.pem  -out unprotected.p12
# -> Just press [return] twice for no password

ลบใบรับรองชั่วคราว

rm temp.pem

ฉันไม่เห็นข้อเสียของวิธีนี้
Matt Beckman

เครื่องมือบางอย่างต้องใช้รหัสผ่าน ตัวอย่างเช่นkeytool -v -list -storetype pkcs12 -keystore unprotected.p12จะส่งคำเตือนและจะไม่แสดงรายการใบรับรอง ดังนั้นจึงอาจใช้งานได้กับ OpenVPN แต่ไม่ใช่สำหรับอย่างอื่น
mivk

@mivk คุณหมายถึงอะไร เครื่องมือบางอย่างจำเป็นต้องใช้รหัสป้องกันด้วยรหัสผ่านหรือไม่
โคเอ็น

1
แน่นอน แต่คำถามเกี่ยวกับการลบรหัสผ่านไม่ใช่เกี่ยวกับแอปพลิเคชันที่ต้องใช้รหัสผ่านในการตั้งค่า
โคเอ็น

2
โซลูชันของคุณไม่ได้สร้างรหัสผ่าน PKCS # 12 โดยไม่มีรหัสผ่าน แต่มีรหัสผ่านที่เป็น "" (สตริง emtpy) ซึ่งไม่เหมือนกัน
Mecki

5

สามารถทำได้ง่ายๆในขั้นตอนเดียวโดยไม่มีไฟล์ชั่วคราว:

openssl pkcs12 -in "PKCSFile" -nodes | openssl pkcs12 -export -out "PKCSFile-Nopass"

ตอบรับพรอมต์นำเข้ารหัสผ่านด้วยรหัสผ่าน ตอบคำถามส่งออกด้วยรหัสผ่านด้วย <CR>

เสร็จสิ้น

โปรดทราบว่านี่จะจัดการใบรับรองระดับกลางใด ๆ ที่อาจอยู่ในชุดรวม ...

ฉันขอแนะนำให้ดูแลไฟล์ดังกล่าว เป็นความคิดที่ดีที่จะตั้งค่า umask เป็น 377 ก่อน (ไม่ใช่ยูนิกซ์: หมายความว่ามีเพียงเจ้าของเท่านั้นที่สามารถอ่านไฟล์ที่สร้างขึ้นได้) ฉันคิดว่าเป็น 2 ขั้นตอนถ้า umask เริ่มต้นของคุณอนุญาต ...


2

ตอนนี้คีย์ส่วนตัว:

openssl pkcs12 -nocerts -in "YourPKCSFile" -out private.key -password pass:PASSWORD -passin pass:PASSWORD -passout pass:TemporaryPassword

ลบข้อความรหัสผ่านตอนนี้:

openssl rsa -in private.key -out "NewKeyFile.key" -passin pass:TemporaryPassword

2 ขั้นตอนอาจถูกแทนที่ด้วย

openssl pkcs12 -nocerts -in "YourPKCSFile" -out private.key -nodes

0

สิ่งเหล่านี้ไม่ได้ผลสำหรับฉัน ในที่สุดฉันกลับไปเป็นรหัส dotNet ซึ่งทำงานครั้งแรก

class Script
{
    static public void Main(string[] args)
    {
                if (args.Length < 3 || args.Contains("/?"))
                {
                    MainHelp(args);
                    return;
                }
       string _infile = args[0],
                        _outfile = args[2];
                string _password = args[1], _outpassword = (args.Length > 3) ? args[3] : "";
                Console.WriteLine(String.Format("{0} -> {1} with ({2} -> {3})", _infile, _outfile, _password, _outpassword));
                System.Security.Cryptography.X509Certificates.X509Certificate2 cert = null;
                Console.WriteLine(String.Format("Load {0} with {2}", _infile, _outfile, _password, _outpassword));
                cert = new System.Security.Cryptography.X509Certificates.X509Certificate2(_infile, _password, X509KeyStorageFlags.Exportable);
                Console.WriteLine(String.Format("Export {1} with {3}", _infile, _outfile, _password, _outpassword));
                System.IO.File.WriteAllBytes(_outfile, cert.Export(System.Security.Cryptography.X509Certificates.X509ContentType.Pfx, _outpassword));
                Console.WriteLine(String.Format("Export complete", _infile, _outfile, _password, _outpassword));
    }

     static public void MainHelp(string[] args)
    {
            Console.WriteLine("Usage pfxremovepwd [inpfx] [inpwd] [outpfx] [optional outpwd]");
            return;
    }
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.