2011-05-03 2 views
6

OpenSSL에서 DSA를 사용하여 서명하려고합니다. 공용 및 개인 키가 들어있는 파일이 있습니다.DSA OpenSSL로 서명

우선 유니 캐스트 연결을 만들고 모든 것이 정상입니다. 그런 다음 멀티 캐스트 UDP 연결이 필요하며 패킷에 서명하고 싶습니다. 내 인증서에서 내 공개 키를로드하려면 함수 PEM_read_DSA_PUBKEY()을 사용하려고하는데 작동하지 않습니다. DSA 구조체 대신 항상 NULL을 반환합니다.

간단한 코드가 있습니다. 나는 이렇게 컴파일한다 :

gcc -Wall -g -lm prueba.c -o prueba -lcrypto 

어떤 생각? 고맙습니다!

#include <stdio.h> 
#include <openssl/dsa.h> 
#include <openssl/pem.h> 

int main() 
{ 
    FILE *DSA_cert_file = fopen("./certs/cert.pem", "r"); 
    if (DSA_cert_file == NULL) 
     return 1; 

    printf("Certificate read\n"); 

    DSA *dsa = DSA_new(); 
    if((dsa = PEM_read_DSA_PUBKEY(DSA_cert_file, 0, 0, 0)) == NULL) 
     return 1; 

    printf("DSA public key read\n"); 

    return 0; 
} 

답변

1

암호로 보호 된 공개 키를 사용하고 있습니까?

그렇다면 PEM_read_DSA_PUBKEY의 세 번째 인수로 콜백 함수를 전달해야합니다. 제공된 암호가 일치하면 올바르게 키를로드 할 수 있습니다.

업데이트 : Hasturkun에 의해 지적

또는, 네 번째 인수로 null로 끝나는 문자열을 전달할 수 있습니다. 인증 기관 매개 변수가 를 NULL로 설정하고 u 매개 변수는 다음 널 (null)이 암호로 사용할 문자열을 종료로 u 매개 변수를 해석하는 NULL이 아닌 경우

다음 official documentation를 인용. cb와 u가 모두 NULL 인 경우 다음 기본 콜백 루틴은 입니다.이 경우 대개 의 암호문이 현재 터미널 의 꺼짐을 해제하고 프롬프트됩니다.

+0

그것은 네 번째 인수 – Hasturkun

+0

@Hasturkun로 널 종료 문자열에 대한 포인터를 전달할 수도 있습니다! 언급 된대로 업데이트되었습니다. 사실은 그의 코드에 불필요한 메모리 누수를 제외하고는 어떤 문제도 보이지 않기 때문에, 그의 키가 패스워드로 보호되어 있고 패스워드를 제대로 제공하지 않는다고 가정합니다. – jweyrich

+0

아니요. 암호를 간단하게 만들기 위해 암호를 사용하지 않았습니다. – calamares

1

cert.pem에 X.509 인증서가 있습니까? PEM_read_DSA_PUBKEY은 X.509 컨테이너가없는 PEM으로 인코딩 된 DSA 공개 키가 필요합니다.

는 대신 같은 것을보십시오 : 사실, 감사 :

X509 *cert; 
EVP_PKEY *pk; 
DSA *dsa; 

cert = PEM_read_X509(DSA_cert_file,NULL,NULL,NULL); 
if (!cert) { /* error */ } 
pk = X509_get_pubkey(cert); 
if (!pk) { /* error */ } 
if (pk->type != 116) { /* not a dsa key */ } 
dsa = pk->pkey.dsa 
관련 문제