0

Perl の SSLeay に問題があります。そして、私は Perl について話す経験がないので、あなたの助けが必要です!

Apple Push Notification Service (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 行目でセグメンテーション違反が発生します。6 行目で終了しても、エラーは発生しません。このステップで何が間違っていますか?

次のステップは、文字列からも証明書を取得することです。SSLeay のドキュメントによると、CTX_use_certificate の 2 番目のパラメーターは 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

この問題を解決するためのヒントやアイデアはありますか?

4

1 に答える 1

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);
于 2013-09-29T16:13:58.060 に答える