pkcs12 컨테이너에서 개인 키 비밀번호를 제거하는 방법?


40
  1. Chrome의 SSL / export 명령을 사용하여 인증서를 추출했습니다.
  2. 그런 다음 openvpn의 구성에서 openvpn에 대한 입력으로 제공하십시오.
    pkcs12 "path/to/pkcs12_container"
  3. 전화를 openvpn ~/openvp_config할 때 개인 키의 암호를 묻습니다 (Chrome을 사용하여 내보낼 때 입력 한 암호).
    Enter Private Key Password:...
  4. 이 비밀번호 요청을 삭제하고 싶습니다.

질문 : pkcs12에서 개인 키의 암호를 제거하는 방법은 무엇입니까?

즉, 비밀번호가 필요없는 pkcs12 파일을 작성하십시오.

(내가 이미 1 년 전에 이미 어떻게했는지, 이제 잊어 버린 것 같습니다.)


다음 스크립트에서이 작업을 수행합니다 (실제로 답은 0입니다) : gist.github.com/5nizza/7ae9cff0d43f33818a33 사용법 :./remove_pass_from_cert.sh YourCertName YourCertPass
Ayrat

답변:


48

다양한 openssl통화 로 달성 할 수 있습니다 .

  • 비밀번호는 현재 비밀번호입니다
  • 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 인증서 부분입니다. - :-) 당신이 그것을 시도 후 upvote에와 답을 받아 주시기 바랍니다 - 나는 ... 수정,이 질문에 오타가
zero0

2
-nodes-export사용될 때 무시 되며,이 경우에는 문서화되어 있지 않습니다 (openssl 매뉴얼 페이지 참조, -nodesPKCS # 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>을 사용하여 Export Passowrd 프롬프트에 응답하십시오.

끝난.

이것은 번들에있을 수있는 많은 중간 인증서를 처리합니다.

결과 파일을 처리하는 것이 좋습니다. umask를 먼저 377로 설정하는 것이 좋습니다 (비 유닉스 : 이것은 소유자 만 생성 된 파일을 읽을 수 있음을 의미합니다.) 기본 umask가 허용되는 경우 2 단계라고 가정합니다 ...


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.