Chilkat HOME .NET Core C# Android™ AutoIt C C# C++ Chilkat2-Python CkPython Classic ASP DataFlex Delphi ActiveX Delphi DLL Go Java Lianja Mono C# Node.js Objective-C PHP ActiveX PHP Extension Perl PowerBuilder PowerShell PureBasic Ruby SQL Server Swift 2 Swift 3,4,5... Tcl Unicode C Unicode C++ VB.NET VBScript Visual Basic 6.0 Visual FoxPro Xojo Plugin
(PowerBuilder) Duplicate openssl req -newkey rsa:2048 -nodes -keyout mydomain.pem -out mydomain.csrDemonstrates how to duplicate this OpenSSL command: openssl req -newkey rsa:2048 -nodes -keyout mydomain.pem -out mydomain.csr This command creates 2 files:
The second file is needed to pair with the certificate that will later be received from the CA.
integer li_rc oleobject loo_Rsa integer li_Success oleobject loo_PrivKey oleobject loo_PrivKeyXml string ls_KeyModulus oleobject loo_AsnRoot oleobject loo_AsnCertReqInfo oleobject loo_AsnCertSubject oleobject loo_AsnTemp oleobject loo_AsnPubKeyInfo oleobject loo_AsnPubKeyAlgId oleobject loo_AsnRsaKey string ls_RsaKeyDerBase64 oleobject loo_BdDer oleobject loo_BdSig oleobject loo_AsnAlgId string ls_CsrBase64 // This example requires the Chilkat API to have been previously unlocked. // See Global Unlock Sample for sample code. loo_Rsa = create oleobject // Use "Chilkat_9_5_0.Rsa" for versions of Chilkat < 10.0.0 li_rc = loo_Rsa.ConnectToNewObject("Chilkat.Rsa") if li_rc < 0 then destroy loo_Rsa MessageBox("Error","Connecting to COM object failed") return end if // Generate a 2048-bit key. Chilkat RSA supports // key sizes ranging from 512 bits to 8192 bits. li_Success = loo_Rsa.GenerateKey(2048) if li_Success <> 1 then Write-Debug loo_Rsa.LastErrorText destroy loo_Rsa return end if loo_PrivKey = loo_Rsa.ExportPrivateKeyObj() // Save the private key to unencrypted PKCS8 PEM li_Success = loo_PrivKey.SavePkcs8PemFile("mydomain.pem") // (alternatively) Save the private key to encrypted PKCS8 PEM li_Success = loo_PrivKey.SavePkcs8EncryptedPemFile("myPassword","mydomain_enc.pem") // We'll need the private key's modulus for the CSR. // The modulus is not something that needs to be protected. Most people don't realize // that a public key is actually just a subset of the private key. The public parts of // an RSA private key are the modulus and exponent. The exponent is always 65537. loo_PrivKeyXml = create oleobject // Use "Chilkat_9_5_0.Xml" for versions of Chilkat < 10.0.0 li_rc = loo_PrivKeyXml.ConnectToNewObject("Chilkat.Xml") li_Success = loo_PrivKeyXml.LoadXml(loo_PrivKey.GetXml()) // Get the modulus in base64 format: ls_KeyModulus = loo_PrivKeyXml.GetChildContent("Modulus") // -------------------------------------------------------------------------------- // Now build the CSR using Chilkat's ASN.1 API. // The keyModulus will be embedded within the ASN.1. // A new ASN.1 object is automatically a SEQUENCE. // Given that the CSR's root item is a SEQUENCE, we can use // this as the root of our CSR. loo_AsnRoot = create oleobject // Use "Chilkat_9_5_0.Asn" for versions of Chilkat < 10.0.0 li_rc = loo_AsnRoot.ConnectToNewObject("Chilkat.Asn") // Beneath the root, we have a SEQUENCE (the certificate request info), // another SEQUENCE (the algorithm identifier), and a BITSTRING (the signature data) li_Success = loo_AsnRoot.AppendSequence() li_Success = loo_AsnRoot.AppendSequence() // ---------------------------------- // Build the Certificate Request Info // ---------------------------------- loo_AsnCertReqInfo = loo_AsnRoot.GetSubItem(0) li_Success = loo_AsnCertReqInfo.AppendInt(0) // Build the Subject part of the Certificate Request Info loo_AsnCertSubject = loo_AsnCertReqInfo.AppendSequenceR() // Add each subject part.. loo_AsnTemp = loo_AsnCertSubject.AppendSetR() li_Success = loo_AsnTemp.AppendSequence2() // AppendSequence2 updates the internal reference to the newly appended SEQUENCE. // The OID and printable string are added to the SEQUENCE. li_Success = loo_AsnTemp.AppendOid("2.5.4.6") li_Success = loo_AsnTemp.AppendString("printable","US") destroy loo_AsnTemp loo_AsnTemp = loo_AsnCertSubject.AppendSetR() li_Success = loo_AsnTemp.AppendSequence2() li_Success = loo_AsnTemp.AppendOid("2.5.4.8") li_Success = loo_AsnTemp.AppendString("utf8","Utah") destroy loo_AsnTemp loo_AsnTemp = loo_AsnCertSubject.AppendSetR() li_Success = loo_AsnTemp.AppendSequence2() li_Success = loo_AsnTemp.AppendOid("2.5.4.7") li_Success = loo_AsnTemp.AppendString("utf8","Lindon") destroy loo_AsnTemp loo_AsnTemp = loo_AsnCertSubject.AppendSetR() li_Success = loo_AsnTemp.AppendSequence2() li_Success = loo_AsnTemp.AppendOid("2.5.4.10") li_Success = loo_AsnTemp.AppendString("utf8","DigiCert Inc.") destroy loo_AsnTemp loo_AsnTemp = loo_AsnCertSubject.AppendSetR() li_Success = loo_AsnTemp.AppendSequence2() li_Success = loo_AsnTemp.AppendOid("2.5.4.11") li_Success = loo_AsnTemp.AppendString("utf8","DigiCert") destroy loo_AsnTemp loo_AsnTemp = loo_AsnCertSubject.AppendSetR() li_Success = loo_AsnTemp.AppendSequence2() li_Success = loo_AsnTemp.AppendOid("2.5.4.3") li_Success = loo_AsnTemp.AppendString("utf8","example.digicert.com") destroy loo_AsnTemp destroy loo_AsnCertSubject // Build the Public Key Info part of the Certificate Request Info loo_AsnPubKeyInfo = loo_AsnCertReqInfo.AppendSequenceR() loo_AsnPubKeyAlgId = loo_AsnPubKeyInfo.AppendSequenceR() li_Success = loo_AsnPubKeyAlgId.AppendOid("1.2.840.113549.1.1.1") li_Success = loo_AsnPubKeyAlgId.AppendNull() destroy loo_AsnPubKeyAlgId // The public key itself is a BIT STRING, but the bit string is composed of ASN.1 // for the RSA public key. We'll first build the RSA ASN.1 for the public key // (containing the 2048 bit modulus and exponent), and encoded it to DER, and then add // the DER bytes as a BIT STRING (as a sub-item of asnPubKeyInfo) // This is already a SEQUENCE.. loo_AsnRsaKey = create oleobject // Use "Chilkat_9_5_0.Asn" for versions of Chilkat < 10.0.0 li_rc = loo_AsnRsaKey.ConnectToNewObject("Chilkat.Asn") // The RSA modulus is a big integer. li_Success = loo_AsnRsaKey.AppendBigInt(ls_KeyModulus,"base64") li_Success = loo_AsnRsaKey.AppendInt(65537) ls_RsaKeyDerBase64 = loo_AsnRsaKey.GetEncodedDer("base64") // Now add the RSA key DER as a BIT STRING. li_Success = loo_AsnPubKeyInfo.AppendBits(ls_RsaKeyDerBase64,"base64") destroy loo_AsnPubKeyInfo // The last part of the certificate request info is an empty context-specific constructed item // with a tag equal to 0. li_Success = loo_AsnCertReqInfo.AppendContextConstructed(0) // Get the DER of the asnCertReqInfo. // This will be signed using the RSA private key. loo_BdDer = create oleobject // Use "Chilkat_9_5_0.BinData" for versions of Chilkat < 10.0.0 li_rc = loo_BdDer.ConnectToNewObject("Chilkat.BinData") li_Success = loo_AsnCertReqInfo.WriteBd(loo_BdDer) // Add the signature to the ASN.1 loo_BdSig = create oleobject // Use "Chilkat_9_5_0.BinData" for versions of Chilkat < 10.0.0 li_rc = loo_BdSig.ConnectToNewObject("Chilkat.BinData") li_Success = loo_Rsa.SignBd(loo_BdDer,"SHA1",loo_BdSig) li_Success = loo_AsnRoot.AppendBits(loo_BdSig.GetEncoded("base64"),"base64") destroy loo_AsnCertReqInfo // ---------------------------------- // Finally, add the algorithm identifier, which is the 2nd sub-item under the root. // ---------------------------------- loo_AsnAlgId = loo_AsnRoot.GetSubItem(1) li_Success = loo_AsnAlgId.AppendOid("1.2.840.113549.1.1.5") li_Success = loo_AsnAlgId.AppendNull() destroy loo_AsnAlgId // Write the CSR to a DER encoded binary file: li_Success = loo_AsnRoot.WriteBinaryDer("qa_output/mydomain.csr") if li_Success <> 1 then Write-Debug loo_AsnRoot.LastErrorText destroy loo_Rsa destroy loo_PrivKeyXml destroy loo_AsnRoot destroy loo_AsnRsaKey destroy loo_BdDer destroy loo_BdSig return end if // It is also possible to get the CSR in base64 format: ls_CsrBase64 = loo_AsnRoot.GetEncodedDer("base64") Write-Debug "Base64 CSR:" Write-Debug ls_CsrBase64 destroy loo_PrivKey destroy loo_Rsa destroy loo_PrivKeyXml destroy loo_AsnRoot destroy loo_AsnRsaKey destroy loo_BdDer destroy loo_BdSig |
© 2000-2024 Chilkat Software, Inc. All Rights Reserved.