The London Perl and Raku Workshop takes place on 26th Oct 2024. If your company depends on Perl, please consider sponsoring and/or attending.

NAME

Convert::X509 - parse X509 Request, Certificate and CRL

SYNOPSYS

  use Convert::X509::Request;
  use Convert::X509::Certificate;
  use Convert::X509::CRL;

  use Data::Dumper;

  my $d;
  local $/;

  open (F,'< request.req');
  $d = Convert::X509::Request->new(<F>);
  print Dumper ($d);
  print join(',',$d->subject()), "\n",
        join("\n",$d->subject('cp866','cp1251')), "\n"; # localized Cyrillic

  open (F,'< certificate.cer');
  $d = Convert::X509::Certificate->new(<F>);
  print Dumper ($d);
  print join(',',$d->issuer()), "\n";

  open (F,'< crl.crl');
  $d = Convert::X509::CRL->new(<F>);
  print Dumper ($d);
  my ($s) = sort keys %{$d->{'crl'}}; # example, take "first" serial
  print 'Revocation reason for certificate N ',$s,' : ',$d->reason($s);
        

DESCRIPTION

Convert::X509 consists of four parts - Request, Certificate, CRL. They are respectively parse requests, certificates and crl-s. Almost any valueble data could be easely extracted directly from returned object (look in Dumper output).

The 4-th module is internal Convert::X509::Parser. Almost everything is located in it - ASN.1 sructure, OIDs "database" and base methods.

Take a look on Convert::X509::minipkcs7 - it just gets serials from PKCS7 message

METHODS

new

Constructor, creates a new object. It takes a parameter which contains req/cert/crl itself - both DER and BASE64 encoding supported.

subject, eku, keyusage, issuer, serial, reason

For some convinience, there are a few methods with self-explaining names.

subject

Applicable to Request and Certificate. Returns a list (!) like ('CN=Name Surname','C=RU','L=Moscow'). Easy to print - join(',',$req->subject()).

X509 data may contains unicode strings, so in general we have to decode it to localized one-byte oriented string. That's why subject can get up to two codepages (look Encode.pm). Second parameter is also a codepage in case when system-wide and console settings are different (for instance, M$ Windows(R) and cyrillic CP1251 & CP866). To set up default encodings one can write

  use Convert::X509::Parser;
  Convert::X509::Parser->_set_cp('cp866','cp1251');

and print $req->subject() with installed options. Now this is not instance-oriented, but global for all reqs, certs and crls.

issuer

Applicable to Certificate and CRL. See subject for details.

eku (EnhancedKeyUsage)

Applicable to Request and Certificate. Returns a list with EKU OIDs.

keyusage

Applicable to Request and Certificate. Returns a list with descriptions for installed bits.

serial

Applicable to Certificate and CRL. Returns serial in hexadecimal view.

reason

Applicable to CRL only. Returns a revocation description for certificate with given serial. If reason totally hasn't been specified - returns 'Unspecified' anyway.

EXPORTS

Nothing is exported (by design)

TODO

  • More supplemental functions.

  • More documentation.

  • More tests.

  • More OIDs/ASN structures.

ACKNOWLEDGEMENTS

These modules were created with initial ideas on the Crypt::X509 package. Thanks to its authors Mike Jackson <mj@sci.fi>, Alexander Jung <alexander.w.jung@gmail.com>, Duncan Segrest <duncan@gigageek.info>;

And also Norbert Klasen (author of x509decode script, which was contributed to Convert::ASN1 in 2002) and Graham Barr <gbarr@pobox.com> (author of Convert::ASN1 package).

P.S.

Your PKCS#xx structures may contain many unusual things, which I haven't ever seen. Mail me any suggestions. And do not afraid to looking inside modules! I hope they are quite simple.

P.P.S.

Probably, I'll change internal interconnections between modules someday, but SYNOPSYS part of this pod will stay the same.

AUTHOR

Leonid Cherepanov <grey.leo AT gmail.com>