Làm cách nào để xóa Mật khẩu khóa riêng tư khỏi thùng chứa pkcs12?


40
  1. Tôi đã trích xuất chứng chỉ bằng lệnh SSL / export của Chrome.
  2. Sau đó cung cấp nó làm đầu vào cho openvpn - trong cấu hình cho openvpn:
    pkcs12 "path/to/pkcs12_container"
  3. Khi gọi openvpn ~/openvp_confignó yêu cầu mật khẩu cho khóa riêng (tôi đã nhập khi xuất bằng Chrome):
    Enter Private Key Password:...
  4. Tôi muốn xóa yêu cầu mật khẩu này.

Câu hỏi: làm thế nào để xóa mật khẩu cho khóa riêng từ pkcs12?

Đó là, tạo tệp pkcs12 không yêu cầu mật khẩu.

(dường như tôi đã bằng cách nào đó đã làm điều này một năm trước, và bây giờ đã quên nó.damn.)


đoạn script sau thực hiện điều này (về cơ bản là câu trả lời bằng 0): gist.github.com/5nizza/7ae9cff0d43f33818a33 cách sử dụng:./remove_pass_from_cert.sh YourCertName YourCertPass
Ayrat

Câu trả lời:


48

Nó có thể đạt được bằng các opensslcuộc gọi khác nhau .

  • PASSWORD là mật khẩu hiện tại của bạn
  • YourPKCSFile là tệp bạn muốn chuyển đổi
  • NewPKCSWithoutPassphraseFile là tệp mục tiêu cho PKCS12 không có cụm mật khẩu

Đầu tiên, trích xuất chứng chỉ:

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

Thứ hai, khóa CA:

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

Bây giờ, khóa riêng:

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

Bây giờ xóa cụm mật khẩu:

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

Kết hợp mọi thứ với tệp PKCS mới:

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

Và tạo tập tin mới:

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

Bây giờ bạn có một tệp khóa PKCS12 mới mà không cần cụm mật khẩu trên phần khóa riêng.


câu trả lời tuyệt vời! .. là ca-cert.cagì?
Ayrat

@Ayrat: Đây là phần chứng chỉ CA trong khóa của bạn. - Tôi có một lỗi đánh máy trong câu trả lời, sửa lỗi ... - cứ thoải mái nâng cấp và chấp nhận câu trả lời sau khi bạn thử nó :-)
zero0

2
-nodesbị bỏ qua khi -exportđược sử dụng, nó không được ghi lại trong trường hợp này (xem trang man openssl, -nodeschỉ được liệt kê khi xuất từ ​​PKCS # 12 sang PEM). Cuộc gọi cuối cùng của bạn vẫn nhắc tôi nhập mật khẩu. Và nếu tôi nhấn return, tôi nhận được tệp PKCS # 12 có mật khẩu là một chuỗi trống và không phải là không có mật khẩu. Khi tôi làm điều openssl pkcs12 -in "NewPKCSWithoutPassphraseFile"đó vẫn nhắc tôi nhập mật khẩu. Tôi chỉ có thể nhấn return và nó hoạt động nhưng nếu không có mật khẩu, nó thậm chí sẽ không nhắc.
Mecki

35

Giải pháp đơn giản nhất tôi tìm thấy

Xuất ra tệp pem tạm thời

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

Chuyển pem trở lại p12

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

Xóa chứng chỉ tạm thời

rm temp.pem

Tôi không thấy nhược điểm của phương pháp này.
Matt Beckman

Một số công cụ yêu cầu mật khẩu. Ví dụ keytool -v -list -storetype pkcs12 -keystore unprotected.p12sẽ phát ra cảnh báo và sẽ KHÔNG liệt kê chứng chỉ. Vì vậy, nó có thể hoạt động cho OpenVPN, nhưng không phải cho cái gì khác.
mivk

@mivk bạn có ý gì? Đó là một số công cụ yêu cầu một khóa bảo vệ mật khẩu?
Koen.

1
Chắc chắn, nhưng câu hỏi là về việc xóa mật khẩu, không phải về các ứng dụng yêu cầu đặt mật khẩu.
Koen.

2
Giải pháp của bạn không tạo mật khẩu PKCS # 12 w / oa nhưng mật khẩu có mật khẩu là "" (chuỗi emtpy), không giống nhau.
Mecki

5

Điều này có thể dễ dàng được thực hiện trong một bước mà không có tệp tạm thời:

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

Trả lời lời nhắc Nhập mật khẩu bằng mật khẩu. Trả lời lời nhắc Xuất khẩu với <CR>

Làm xong.

Lưu ý rằng điều này xử lý bất kỳ số chứng chỉ trung gian nào có thể có trong gói ...

Tôi thực sự khuyên bạn nên cẩn thận với tệp kết quả; sẽ là một ý tưởng tốt khi đặt umask thành 377 trước (không phải là unix: điều này có nghĩa là chỉ chủ sở hữu mới có thể đọc tệp được tạo.) Tôi cho rằng đó là 2 bước, nếu ô mặc định của bạn được cho phép ...


2

Bây giờ, khóa riêng:

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

Xóa ngay cụm mật khẩu:

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

2 bước có thể được thay thế bởi

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

0

Không ai trong số này làm việc cho tôi. Cuối cùng, tôi trở lại mã dotNet hoạt động lần đầu tiên.

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;
    }
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.