Import & Export Internet Certificates Programatically
Thomas Hampel
18 June 2015We all know that Admins are lazy. Being lazy can be helpful when having development skills, especially to reduce the amount of helpdesk calls by automating boring work.
How to import X509 certificates into a Notes ID when the certificate itself is stored in the Windows certificate store?
S/MIME Import / Export Automation
If needed, users can then export or import Internet Certificates directly from the Notes Client, but who wants to do that manually?
Even exporting the certificate from the Notes ID is too complicated for most users...
Looking for an automated way to export Internet Certificates, the pubnames.ntf provides there are some undocumented @Formulas that can be found for working with X509 certificates
- @X509Certificates([Subject];UserCertificate;"");
Returns the list of subjects of the internet certificates stored in the person document field named "UserCertificate" - @Command([PKCS12ExportCertsFromNAB];UserCertificate;Certificate;Number;"0")
Where "Number" is the element in the list returned by @X509Certificates
In my opinion those @Functions still show too many dialog boxes, so lets try to make it more simple.
The C-API documentation provides the functions required namely PKCS12_ExportIDFileToFile and PKCS12_ImportFileToIDFile.
Wrapping both into a small script is easy...
Declare Function PKCS12_ExportIDFileToFile Lib "nnotes" Alias "PKCS12_ExportIDFileToFile" (_
ByVal pIdFilename As String,_
ByVal pIdFilepassword As String,_
ByVal pPKCS12Filename As String,_
ByVal pPKCS12Filepassword As String,_
ByVal ExportFlags As Long,_
ByVal ReservedFlags As Long,_
Preserved As Any) As Integer
Declare Function PKCS12_ImportFileToIDFile Lib "nnotes" Alias "PKCS12_ImportFileToIDFile" (_
ByVal pPKCS12Filename As String,_
ByVal pPKCS12Filepassword As String,_
ByVal pIdFilename As String,_
ByVal pIdFilepassword As String,_
ByVal ImportFlags As Long,_
ByVal ReservedFlags As Long,_
Preserved As Any) As Integer
Const PKCS12_EXCLUDE_PRIVATEKEYS=&h00000001
Calling those API's would be able to import a certificate from a file, but often the certificate has already been deployed to (e.g.) the Windows certificate store.
It would have been easy to use a Windows API call to export a certificate into a file and then import it again back into the Notes ID using the Notes API calls above.
Unfortunately M$ discontinued support for CAPICOM after Windows XP... so we have to use old school methods like using command line tools like Certutil
still with the resulting functions you can Import and Export X509 certificates from the Windows certificate store to the NotesID and back.
ImportInternetCertificatesFromOSCredentialStore.lss
ExportnternetCertificatesToOSCredentialStore.lss
As usual mind YMMV and feel free to further optimize the code to fit your needs-
Please use at your own risk and report back any suggestions or improvements!
Special Thanks to Marcus Floeser for providing the screenshot.