>백엔드 개발 >Golang >사용자 정의 crypto.Signer 구현을 사용하여 X.509 인증서를 생성할 수 없습니다.

사용자 정의 crypto.Signer 구현을 사용하여 X.509 인증서를 생성할 수 없습니다.

PHPz
PHPz앞으로
2024-02-10 20:42:07841검색

无法使用自定义 crypto.Signer 实现生成 X.509 证书

php 편집기 Youzi는 X.509 인증서 생성에 관한 문제를 소개하기 위해 왔습니다. 때로는 사용자 정의 crypto.Signer 구현을 사용하여 인증서를 생성할 때 사용할 수 없는 문제가 발생할 수 있습니다. 이 문제로 인해 개발자는 해결 방법을 혼란스러워할 수 있습니다. 이 기사에서는 이 문제의 원인을 살펴보고 개발자가 자신의 X.509 인증서를 성공적으로 생성하는 데 도움이 되는 몇 가지 솔루션을 제공합니다.

질문 내용

hsm에 저장된 rsa 키 쌍을 기반으로 x.509 인증서를 생성하려고 합니다. 나는 이 pkcs #11 구현을 사용하여 hsm과 통신합니다.

내 암호화 개체는 후자에 저장되므로 수행하려는 작업에 개인 키(예: 서명)가 필요한 경우 "개인 키에 액세스"하려면 crypto.signer 인터페이스를 구현해야 합니다. 이것이 구현입니다.

으아아아

이 구현은 작동합니다. 예를 들어 csr을 생성하려면 createcertificaterequest 함수에 csr(priv any 参数),这是我提供 rsasigner 인스턴스가 있는 위치)에 서명하기 위한 개인 키가 필요합니다.

createcertificate 함수는 다소 유사하며 매개변수 pub是要生成的证书的公钥,priv는 서명자의 개인 키입니다.

아래 코드에서는 자체 서명된 x.509 인증서를 생성하려고 하므로 templateparent매개변수는 API에 따라 동일합니다.

으아아아

키 유형(rsa 또는 ec)에 관계없이 이 함수는 다음 오류를 반환합니다.

으아아아

이 오류는 crypto.signer 구현이 올바르게 완료되지 않은 경우 반환됩니다.

타원 곡선의 키 쌍을 사용하여 동일한 작업을 수행하려고 crypto.signer을 구현했지만 오류는 동일합니다.

또한 sign 함수에서 다양한 해싱 알고리즘을 시도했지만 아무 것도 변경되지 않았습니다.

CSR을 생성하는 데 사용할 수 있지만 crypto.signer 구현에서 오류가 발생한 것 같습니다.

Solution

몇 달 전에 이 문제에 대한 해결책을 찾았지만 답변을 공유할 시간은 없었지만 지금이 바로 그 때입니다.

pkcs #11을 통해 직접 서명하는 경우 여기에 참조된 digestinfo 값을 사용하여 해시 접두사를 수동으로 지정하여 해시 접두사를 관리해야 합니다. https://www.rfc-editor.org/rfc /rfc3447#page-43 .

더 정확하게는 rsassa-pkcs1-v1_5 서명의 경우 실제 서명 함수에 대한 입력은 asn.1 der 인코딩된 구조입니다. pkcs #11에는 구조를 생성하는 방법을 알고 있는 해시별 메커니즘(예: ckm_sha256_rsa_pkcs)이 있지만 모두 데이터가 해시되지 않는다고 가정합니다. 이는 암호화폐의 경우와 다릅니다. signer 인터페이스이므로 원시 서명 작업만 수행하는 일반 cka_rsa_pkcs 메커니즘을 사용해야 합니다. 이는 우리가 사용하려는 모든 해시에 대해 올바른 접두사를 제공하기만 하면 asn.1 구조를 직접 생성해야 함을 의미합니다.

crypto.signeropts 유형의 opts 매개변수를 사용하면 sign() 함수가 호출될 때 올바른 접두사가 적용된 crypto.hash 유형의 해시 함수 식별자를 검색할 수 있습니다.

으아아아

그것은 매력처럼 작동합니다. 하지만 더 좋은 일이 있습니다.

ckm_rsa_pkcs 메커니즘은 rsassa-pkcs1-v1_5 유형의 서명을 제공합니다. 더 이상 새로운 제품/소프트웨어에 사용되어서는 안 되는 이 오래된 서명 체계를 스스로 조사하도록 관심 있는 독자들에게 맡깁니다.

실제로 rsassa-pss 유형 서명을 제공하는 ckm_rsa_pkcs_pss 메커니즘을 사용하는 것이 좋습니다.

이 원칙에서 출발하여 현재 제가 사용하는 구현은 다음과 같습니다.

으아아아

그래서 접두사는 더 이상 필요하지 않지만, 사용할 해시 알고리즘 식별자와 서명 알고리즘 및 사용할 mgf 간의 대응이 필요합니다.

마지막으로, 사용되는 서명 알고리즘은 더 이상 x509.sha256withrsa, x509.sha384withrsa 또는 x509.sha512withrsa이 아니라 sha256withrsapss, sha38입니다. 4withrsapss sha512withrsapss.

서명 축하드립니다.

위 내용은 사용자 정의 crypto.Signer 구현을 사용하여 X.509 인증서를 생성할 수 없습니다.의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 stackoverflow.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제