NAME
Crypt::OpenSSL::PKCS10 - Perl extension to OpenSSL's PKCS10 API.
SYNOPSIS
my
$req
= Crypt::OpenSSL::PKCS10->new;
$req
->set_subject(
"/C=RO/O=UTI/OU=ssi"
);
$req
->add_ext(Crypt::OpenSSL::PKCS10::NID_key_usage,
"critical,digitalSignature,keyEncipherment"
);
$req
->add_ext(Crypt::OpenSSL::PKCS10::NID_ext_key_usage,
"serverAuth, nsSGC, msSGC, 1.3.4"
);
$req
->add_ext(Crypt::OpenSSL::PKCS10::NID_subject_alt_name,
"email:steve@openssl.org"
);
$req
->add_custom_ext(
'1.2.3.3'
,
"My new extension"
);
$req
->add_ext_final();
$req
->sign();
$req
->write_pem_req(
'request.pem'
);
$req
->write_pem_pk(
'pk.pem'
);
$req
->get_pem_pubkey();
$req
->pubkey_type();
$req
->get_pem_req();
Crypt::OpenSSL::PKCS10->new()
# Defaults to a 1024-bit RSA private key
Crypt::OpenSSL::PKCS10->new(2048)
# Specify a 2048-bit RSA private key
# With 2 arguements the keysize must be first
Crypt::OpenSSL::PKCS10->new(
2048,
# 2048-bit RSA keysize
{
type
=>
'rsa'
,
# Private key type ('rsa' or 'ec')
hash
=>
'SHA256'
,
# Hash Algorithm name
});
Crypt::OpenSSL::PKCS10->new(
{
type
=>
'ec'
,
# Private key type ('rsa' or 'ec')
curve
=>
'secp384r1'
,
# Eliptic Curve type (secp384r1 default)
hash
=>
'SHA256'
,
# Hash Algorithm name
});
ABSTRACT
Crypt::OpenSSL::PKCS10 - Perl extension to OpenSSL's PKCS10 API.
DESCRIPTION
Crypt::OpenSSL::PKCS10 provides the ability to create PKCS10 certificate requests using RSA key pairs.
Class Methods
- new
-
Create a new Crypt::OpenSSL::PKCS10 object by generating a new key pair. There are two optional arguments, the key size which defaults to 1024, and a hash of options which can be used to customize options.
Crypt::OpenSSL::PKCS10->new()
# Defaults to a 1024-bit RSA private key
Crypt::OpenSSL::PKCS10->new(2048)
# Specify a 2048-bit RSA private key
# With 2 arguements the keysize must be first
Crypt::OpenSSL::PKCS10->new(
2048,
# 2048-bit RSA keysize
{
type
=>
'rsa'
,
# Private key type ('rsa' or 'ec')
hash
=>
'SHA256'
,
# Hash Algorithm name
});
Crypt::OpenSSL::PKCS10->new(
{
type
=>
'ec'
,
# Private key type ('rsa' or 'ec')
curve
=>
'secp384r1'
,
# Eliptic Curve type (secp384r1 default)
hash
=>
'SHA256'
,
# Hash Algorithm name
});
- new_from_rsa( $rsa_object )
-
Create a new Crypt::OpenSSL::PKCS10 object by using key information from a Crypt::OpenSSL::RSA object. Here is an example:
my
$rsa
= Crypt::OpenSSL::RSA->generate_key(512);
my
$req
= Crypt::OpenSSL::PKCS10->new_from_rsa(
$rsa
);
my
$rsa
= Crypt::OpenSSL::RSA->generate_key(1024);
my
$req
= Crypt::OpenSSL::PKCS10->new_from_rsa(
$rsa
, {
type
=>
'rsa'
,
hash
=>
'SHA384'
});
OpenSSL 3.0 has deprecated the RSA object which Crypt::OpenSSL::RSA creates. new_from_rsa() is now a perl sub which obtains the private key as a string that is also passed to the _new_from_rsa() XS function.
- new_from_file( $filename )
-
Create a new Crypt::OpenSSL::PKCS10 object by reading the request and key information from a PEM formatted file. Here is an example:
my
$req
= Crypt::OpenSSL::PKCS10->new_from_file(
"CSR.csr"
);
You can also specify the format of the PKCS10 file, either DER or PEM format. Here are some examples:
my
$req
= Crypt::OpenSSL::PKCS10->new_from_file(
"CSR.csr"
, Crypt::OpenSSL::PKCS10::FORMAT_PEM());
my
$req
= Crypt::OpenSSL::PKCS10->new_from_file(
"CSR.der"
, Crypt::OpenSSL::PKCS10::FORMAT_ASN1());
Instance Methods
- set_subject($subject, [ $utf8 ])
-
Sets the subject DN of the request. Note: $subject is expected to be in the format /type0=value0/type1=value1/type2=... where characters may be escaped by \. If $utf8 is non-zero integer, $subject is interpreted as UTF-8 string.
- add_ext($nid, $extension)
-
Adds a new extension to the request. The first argument $nid is one of the exported constants (see below). The second one $extension is a string (for more info read
openssl(3)
).$req
->add_ext(Crypt::OpenSSL::PKCS10::NID_key_usage,
"critical,digitalSignature,keyEncipherment"
);
$req
->add_ext(Crypt::OpenSSL::PKCS10::NID_ext_key_usage,
"serverAuth, nsSGC, msSGC, 1.3.4"
);
$req
->add_ext(Crypt::OpenSSL::PKCS10::NID_subject_alt_name,
"email:steve@openssl.org"
);
- add_custom_ext($oid, $desc)
-
Adds a new custom extension to the request. The value is added as a text string, using ASN.1 encoding rules inherited from the Netscape Comment OID.
$req
->add_custom_ext(
'1.2.3.3'
,
"My new extension"
);
- add_custom_ext_raw($oid, $bytes)
-
Adds a new custom extension to the request. The value is added as a raw DER octet string. Use this if you are packing your own ASN.1 structures and need to set the extension value directly.
$req
->add_custom_ext_raw(
$oid
,
pack
(
'H*'
,
'1E06006100620063'
))
# BMPString 'abc'
- add_ext_final()
-
This must be called after all extensions has been added. It actually copies the extension stack to request structure.
$req
->add_ext(Crypt::OpenSSL::PKCS10::NID_subject_alt_name,
"email:my@email.org"
);
$req
->add_ext_final();
- sign()
-
This adds the signature to the PKCS10 request.
$req
->sign();
$req
->sign(
"SHA256"
);
# Set the hash to use for the signature
- pubkey_type()
-
Returns the type of the PKCS10 public key - one of (rsa|dsa|ec).
$req
->pubkey_type();
- get_pubkey()
-
Returns the PEM encoding of the PKCS10 public key.
$req
->get_pubkey();
- get_pem_req()
-
Returns the PEM encoding of the PKCS10 request.
$req
->get_pem_req();
- write_pem_req($filename)
-
Writes the PEM encoding of the PKCS10 request to a given file.
$req
->write_pem_req(
'request.pem'
);
- get_pem_pk()
-
Returns the PEM encoding of the private key.
$req
->get_pem_pk();
- write_pem_pk($filename)
-
Writes the PEM encoding of the private key to a given file.
$req
->write_pem_pk(
'request.pem'
);
- subject()
-
returns the subject of the PKCS10 request
$subject
=
$req
->subject();
- keyinfo()
-
returns the human readable info about the key of the PKCS10 request
$keyinfo
=
$req
->keyinfo();
EXPORT
None by default.
On request:
NID_key_usage NID_subject_alt_name NID_netscape_cert_type NID_netscape_comment
NID_ext_key_usage
BUGS
If you destroy $req object that is linked to a Crypt::OpenSSL::RSA object, the RSA private key is also freed, thus you can't use latter object anymore. Avoid this:
my
$rsa
= Crypt::OpenSSL::RSA->generate_key(512);
my
$req
= Crypt::OpenSSL::PKCS10->new_from_rsa(
$rsa
);
undef
$req
;
$rsa
->get_private_key_string();
SEE ALSO
Crypt::OpenSSL::RSA
, Crypt::OpenSSL::X509
.
AUTHOR
JoNO, <jonozzz@yahoo.com>
COPYRIGHT AND LICENSE
Copyright (C) 2006 by JoNO
This library is free software; you can redistribute it and/or modify it under the same terms as Perl itself, either Perl version 5.8.2 or, at your option, any later version of Perl 5 you may have available.