```{index} single: IO::Socket::SSL::Utils ``` # IO::Socket::SSL::Utils loading, storing, creating certificates and keys ## SYNOPSIS ```perl use IO::Socket::SSL::Utils; $cert = PEM_file2cert('cert.pem'); # load certificate from file my $hash = CERT_asHash($cert); # get details from certificate PEM_cert2file($cert,'cert.pem'); # write certificate to file CERT_free($cert); # free memory within OpenSSL @certs = PEM_file2certs('chain.pem'); # load multiple certificates from file PEM_certs2file('chain.pem', @certs); # write multiple certificates to file CERT_free(@certs); # free memory for all within OpenSSL my $cert = PEM_string2cert($pem); # load certificate from PEM string $pem = PEM_cert2string($cert); # convert certificate to PEM string $key = KEY_create_rsa(2048); # create new 2048-bit RSA key PEM_key2file($key,"key.pem"); # and write it to file KEY_free($key); # free memory within OpenSSL ``` ## DESCRIPTION This module provides various utility functions to work with certificates and private keys, shielding some of the complexity of the underlying Net::SSLeay and OpenSSL. ## FUNCTIONS - Functions converting between string or file and certificates and keys. They croak if the operation cannot be completed. - PEM\_file2cert(file) -> cert - PEM\_cert2file(cert,file) - PEM\_file2certs(file) -> @certs - PEM\_certs2file(file,@certs) - PEM\_string2cert(string) -> cert - PEM\_cert2string(cert) -> string - PEM\_file2key(file) -> key - PEM\_key2file(key,file) - PEM\_string2key(string) -> key - PEM\_key2string(key) -> string - Functions for cleaning up. Each loaded or created cert and key must be freed to not leak memory. - CERT\_free(@certs) - KEY\_free(@keys) - KEY\_create\_rsa(bits) -> key Creates an RSA key pair, bits defaults to 2048. - KEY\_create\_ec(curve) -> key Creates an EC key, curve defaults to `prime256v1`. - CERT\_asHash(cert,\[digest\_algo\]) -> hash Extracts the information from the certificate into a hash and uses the given digest\_algo (default: SHA-256) to determine digest of pubkey and cert. The resulting hash contains: - subject Hash with the parts of the subject, e.g. commonName, countryName, organizationName, stateOrProvinceName, localityName. If there are multiple values for any of these parts the hash value will be an array ref with the values in order instead of just a scalar. - subjectAltNames Array with list of alternative names. Each entry in the list is of `[type,value]`, where `type` can be OTHERNAME, EMAIL, DNS, X400, DIRNAME, EDIPARTY, URI, IP or RID. - issuer Hash with the parts of the issuer, e.g. commonName, countryName, organizationName, stateOrProvinceName, localityName. If there are multiple values for any of these parts the hash value will be an array ref with the values in order instead of just a scalar. - not\_before, not\_after The time frame, where the certificate is valid, as time\_t, e.g. can be converted with localtime or similar functions. - serial The serial number - crl\_uri List of URIs for CRL distribution. - ocsp\_uri List of URIs for revocation checking using OCSP. - keyusage List of keyUsage information in the certificate. - extkeyusage List of extended key usage information from the certificate. Each entry in this list consists of a hash with oid, nid, ln and sn. - pubkey\_digest\_xxx Binary digest of the pubkey using the given digest algorithm, e.g. pubkey\_digest\_sha256 if (the default) SHA-256 was used. - x509\_digest\_xxx Binary digest of the X.509 certificate using the given digest algorithm, e.g. x509\_digest\_sha256 if (the default) SHA-256 was used. - fingerprint\_xxx Fingerprint of the certificate using the given digest algorithm, e.g. fingerprint\_sha256 if (the default) SHA-256 was used. Contrary to digest\_\* this is an ASCII string with a list if hexadecimal numbers, e.g. "73:59:75:5C:6D...". - signature\_alg Algorithm used to sign certificate, e.g. `sha256WithRSAEncryption`. - ext List of extensions. Each entry in the list is a hash with oid, nid, sn, critical flag (boolean) and data (string representation given by X509V3\_EXT\_print). - version Certificate version, usually 2 (x509v3) - CERT\_create(hash) -> (cert,key) Creates a certificate based on the given hash. If the issuer is not specified the certificate will be self-signed. The following keys can be given: - subject Hash with the parts of the subject, e.g. commonName, countryName, ... as described in `CERT_asHash`. Default points to IO::Socket::SSL. - not\_before A time\_t value when the certificate starts to be valid. Defaults to current time. - not\_after A time\_t value when the certificate ends to be valid. Defaults to current time plus one 365 days. - serial The serial number. If not given a cryptographically random 32-bit value is generated using `Net::SSLeay::RAND_bytes`. - version The version of the certificate, default 2 (x509v3). - CA true|false If true declare certificate as CA, defaults to false. - purpose string|array|hash Set the purpose of the certificate. The different purposes can be given as a string separated by non-word character, as array or hash. With string or array each purpose can be prefixed with '+' (enable) or '-' (disable) and same can be done with the value when given as a hash. By default enabling the purpose is assumed. If the CA option is given and true the defaults "ca,sslca,emailca,objca" are assumed, but can be overridden with explicit purpose. If the CA option is given and false the defaults "server,client" are assumed. If no CA option and no purpose is given it defaults to "server,client". Purpose affects basicConstraints, keyUsage, extKeyUsage and netscapeCertType. The following purposes are defined (case is not important): ```text client server email objsign CA sslCA emailCA objCA emailProtection codeSigning timeStamping digitalSignature nonRepudiation keyEncipherment dataEncipherment keyAgreement keyCertSign cRLSign encipherOnly decipherOnly ``` Examples: ```perl # root-CA for SSL certificates purpose => 'sslCA' # or CA => 1 # server certificate and CA (typically self-signed) purpose => 'sslCA,server' # client certificate purpose => 'client', ``` - ext \[{ sn => .., data => ... }, ... \] List of extensions. The type of the extension can be specified as name with `sn` or as NID with `nid` and the data with `data`. These data must be in the same syntax as expected within openssl.cnf, e.g. something like `OCSP;URI=http://...`. Additionally the critical flag can be set with `critical =` 1>. - key key use given key as key for certificate, otherwise a new one will be generated and returned - issuer\_cert cert set issuer for new certificate - issuer\_key key sign new certificate with given key - issuer \[ cert, key \] Instead of giving issuer\_key and issuer\_cert as separate arguments they can be given both together. - digest algorithm specify the algorithm used to sign the certificate, default SHA-256. - ignore\_invalid\_args ignore any unknown arguments which might be in the argument list (which might be in the arguments for example as result from CERT\_asHash) ## AUTHOR Steffen Ullrich