WvStreams
printcert.cc
00001 #include "wvargs.h"
00002 #include "wvcrash.h"
00003 #include "wvfile.h"
00004 #include "wvlog.h"   
00005 #include "wvstrutils.h"
00006 #include "wvx509.h"
00007 #include "wvautoconf.h"
00008 
00009 void print_details(WvX509 *x509)
00010 {
00011     wvcon->print("Subject: %s\n", x509->get_subject());
00012     wvcon->print("Issuer: %s\n", x509->get_issuer());
00013     wvcon->print("Serial: %s\n", x509->get_serial());
00014     time_t t1 = x509->get_notvalid_before();
00015     time_t t2 = x509->get_notvalid_after();
00016     
00017     wvcon->print("Not Valid Before: %s\n", ctime(&t1));
00018     wvcon->print("Not Valid After: %s\n", ctime(&t2));
00019     wvcon->print("Key Usage: %s\n", x509->get_key_usage());
00020     wvcon->print("Ext Key Usage: %s\n", x509->get_ext_key_usage());
00021     wvcon->print("Authority Info Access: \n%s\n", x509->get_aia());
00022     WvStringList list;
00023     x509->get_ca_urls(list);
00024     wvcon->print("CA Issuers available from:\n%s\n", list.join("\n"));
00025     list.zap();
00026     x509->get_ocsp(list);
00027     wvcon->print("OCSP Responders available from:\n%s\n", list.join("\n"));
00028     list.zap();
00029     x509->get_crl_urls(list); 
00030     wvcon->print("CRL Distribution Points:\n%s\n", list.join("\n"));
00031     list.zap();
00032     x509->get_policies(list);
00033     wvcon->print("Certificate Policy OIDs:\n%s\n", list.join("\n"));
00034 
00035 #ifdef HAVE_OPENSSL_POLICY_MAPPING
00036     int requireExplicitPolicy, inhibitPolicyMapping;
00037     x509->get_policy_constraints(requireExplicitPolicy, inhibitPolicyMapping);
00038     wvcon->print("Certificate Policy Constraints: requireExplicitPolicy: %s "
00039                  "inhibitPolicyMapping: %s\n", requireExplicitPolicy, 
00040                  inhibitPolicyMapping);
00041 
00042     WvX509::PolicyMapList maplist;
00043     x509->get_policy_mapping(maplist);
00044     wvcon->print("Policy mappings:\n");
00045     WvX509::PolicyMapList::Iter i(maplist);
00046     for (i.rewind(); i.next();)
00047         wvcon->print("%s -> %s\n", i().issuer_domain, i().subject_domain);
00048 #endif
00049 }
00050 
00051 
00052 int main(int argc, char **argv)
00053 {
00054     wvcrash_setup(argv[0]);
00055 
00056     WvString certtype = "pem";
00057     WvStringList remaining_args;
00058 
00059     WvArgs args;
00060     args.add_required_arg("certificate");
00061     args.add_option('t', "type", "Certificate type: der or pem (default: pem)", 
00062                     "type", certtype);
00063     if (!args.process(argc, argv, &remaining_args) || remaining_args.count() < 1)
00064     {
00065         args.print_help(argc, argv);
00066         return -1;
00067     }
00068     // FIXME: not working yet
00069 #if 0
00070     WvX509 x509;
00071     if (certtype == "der")
00072         x509.load(WvX509Mgr::CertDER, remaining_args.popstr());   
00073     else if (certtype == "pem")
00074         x509.load(WvX509Mgr::CertPEM, remaining_args.popstr());
00075     else
00076     {
00077         wverr->print("Invalid certificate type '%s'\n", certtype);
00078         return -1;
00079     }
00080 
00081     if (x509.isok())
00082         print_details(&x509);
00083     else
00084         wverr->print("X509 certificate not valid\n");
00085 #endif    
00086     return 0;
00087 }