Perl SSLeay证书和密钥作为字符串

时间:2013-06-06 10:13:30

标签: perl

我在Perl中遇到SSLeay的问题。而且我没有Perl的经验,所以我需要你的帮助!

我正在尝试与Apple Apple推送通知服务(APNS)进行通信。这很容易,但我不能使用文件来存储证书和RSA私钥。该代码应该从数据库运行。

这有效:

Net::SSLeay::CTX_use_RSAPrivateKey_file( $ctx, 'key.pem', &Net::SSLeay::FILETYPE_PEM );
die_if_ssl_error("private key");

Net::SSLeay::CTX_use_certificate_file( $ctx, 'cert.pem', &Net::SSLeay::FILETYPE_PEM );
die_if_ssl_error("certificate");

但正如我之前所说,我不能使用文件。所以我尝试了这个:

$private_key = '----BEGIN RSA PRIVATE [...]';

my $rsa_private = Crypt::OpenSSL::RSA->new_private_key($private_key);
Net::SSLeay::CTX_use_RSAPrivateKey( $ctx, $rsa_private );
die_if_ssl_error("private key");

Net::SSLeay::CTX_use_certificate_file( $ctx, 'cert.pem', &Net::SSLeay::FILETYPE_PEM );
die_if_ssl_error("certificate");

但现在我在第7行遇到Segmentation fault。如果我在第6行退出,则不会发生错误。 我在这一步做错了什么?

下一步是从字符串中获取证书。 SSLeay的文档说CTX_use_certificate的第二个参数必须是x509对象。所以我尝试创建一个:

my $private_key = '----BEGIN RSA PRIVATE [...]';
my $certificate = '----BEGIN CERTIFICATE [...]';

my $rsa_private = Crypt::OpenSSL::RSA->new_private_key($private_key);
Net::SSLeay::CTX_use_RSAPrivateKey( $ctx, $rsa_private );
die_if_ssl_error("private key");

my $x509 = Crypt::OpenSSL::X509->new_from_string($certificate);    
Net::SSLeay::CTX_use_certificate( $ctx, $x509 );
die_if_ssl_error("certificate");

但这给了我:

certificate 9530: 1 - error:140BF10C:SSL routines:SSL_SET_CERT:x509 lib
9530: certificate

您是否有任何提示或想法如何解决此问题?

1 个答案:

答案 0 :(得分:1)

如果Net :: SSLeay版本等于或高于1.45

,这应该可行
my $pkey = '----BEGIN PRIVATE KEY ... (PEM formated)';
my $cert = '----BEGIN CERTIFICATE ... (PEM formated)';

my $bio_key = Net::SSLeay::BIO_new(Net::SSLeay::BIO_s_mem()) or die;
Net::SSLeay::BIO_write($bio_key, $pkey) or die "no key";
my $evp_pkey = Net::SSLeay::PEM_read_bio_PrivateKey($bio_key, 
               sub { RETURN PASSWORD IF ANY NESSESARY}) or die "no evp_pkey structure";
Net::SSLeay::CTX_use_PrivateKey($ctx, $evp_pkey);
Net::SSLeay::BIO_free($bio_key);

my $bio_cert = Net::SSLeay::BIO_new(Net::SSLeay::BIO_s_mem()) or die;
Net::SSLeay::BIO_write($bio_cert, $cert) or die "no cert";
my $x509 = Net::SSLeay::PEM_read_bio_X509($bio_cert) or die "no x509 structure";
Net::SSLeay::CTX_use_certificate($ctx, $x509) or die ;
Net::SSLeay::BIO_free($bio_cert);