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
(Swift 3,4,5...) 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.
func chilkatTest() { // This example requires the Chilkat API to have been previously unlocked. // See Global Unlock Sample for sample code. let rsa = CkoRsa()! // Generate a 2048-bit key. Chilkat RSA supports // key sizes ranging from 512 bits to 8192 bits. var success: Bool = rsa.generateKey(2048) if success != true { print("\(rsa.lastErrorText!)") return } var privKey: CkoPrivateKey? = rsa.exportPrivateKeyObj() // Save the private key to unencrypted PKCS8 PEM success = privKey!.savePkcs8PemFile("mydomain.pem") // (alternatively) Save the private key to encrypted PKCS8 PEM success = privKey!.savePkcs8EncryptedPemFile("myPassword", path: "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. let privKeyXml = CkoXml()! success = privKeyXml.load(privKey!.getXml()) // Get the modulus in base64 format: var keyModulus: String? = 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. let asnRoot = CkoAsn()! // Beneath the root, we have a SEQUENCE (the certificate request info), // another SEQUENCE (the algorithm identifier), and a BITSTRING (the signature data) success = asnRoot.appendSequence() success = asnRoot.appendSequence() // ---------------------------------- // Build the Certificate Request Info // ---------------------------------- var asnCertReqInfo: CkoAsn? = asnRoot.getSubItem(0) success = asnCertReqInfo!.appendInt(0) // Build the Subject part of the Certificate Request Info var asnCertSubject: CkoAsn? = asnCertReqInfo!.appendSequenceR() // Add each subject part.. var asnTemp: CkoAsn? = asnCertSubject!.appendSetR() success = asnTemp!.appendSequence2() // AppendSequence2 updates the internal reference to the newly appended SEQUENCE. // The OID and printable string are added to the SEQUENCE. success = asnTemp!.appendOid("2.5.4.6") success = asnTemp!.append("printable", value: "US") asnTemp = nil asnTemp = asnCertSubject!.appendSetR() success = asnTemp!.appendSequence2() success = asnTemp!.appendOid("2.5.4.8") success = asnTemp!.append("utf8", value: "Utah") asnTemp = nil asnTemp = asnCertSubject!.appendSetR() success = asnTemp!.appendSequence2() success = asnTemp!.appendOid("2.5.4.7") success = asnTemp!.append("utf8", value: "Lindon") asnTemp = nil asnTemp = asnCertSubject!.appendSetR() success = asnTemp!.appendSequence2() success = asnTemp!.appendOid("2.5.4.10") success = asnTemp!.append("utf8", value: "DigiCert Inc.") asnTemp = nil asnTemp = asnCertSubject!.appendSetR() success = asnTemp!.appendSequence2() success = asnTemp!.appendOid("2.5.4.11") success = asnTemp!.append("utf8", value: "DigiCert") asnTemp = nil asnTemp = asnCertSubject!.appendSetR() success = asnTemp!.appendSequence2() success = asnTemp!.appendOid("2.5.4.3") success = asnTemp!.append("utf8", value: "example.digicert.com") asnTemp = nil asnCertSubject = nil // Build the Public Key Info part of the Certificate Request Info var asnPubKeyInfo: CkoAsn? = asnCertReqInfo!.appendSequenceR() var asnPubKeyAlgId: CkoAsn? = asnPubKeyInfo!.appendSequenceR() success = asnPubKeyAlgId!.appendOid("1.2.840.113549.1.1.1") success = asnPubKeyAlgId!.appendNull() asnPubKeyAlgId = nil // 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.. let asnRsaKey = CkoAsn()! // The RSA modulus is a big integer. success = asnRsaKey.appendBigInt(keyModulus, encoding: "base64") success = asnRsaKey.appendInt(65537) var rsaKeyDerBase64: String? = asnRsaKey.getEncodedDer("base64") // Now add the RSA key DER as a BIT STRING. success = asnPubKeyInfo!.appendBits(rsaKeyDerBase64, encoding: "base64") asnPubKeyInfo = nil // The last part of the certificate request info is an empty context-specific constructed item // with a tag equal to 0. success = asnCertReqInfo!.appendContextConstructed(0) // Get the DER of the asnCertReqInfo. // This will be signed using the RSA private key. let bdDer = CkoBinData()! success = asnCertReqInfo!.writeBd(bdDer) // Add the signature to the ASN.1 let bdSig = CkoBinData()! success = rsa.signBd(bdDer, hashAlgorithm: "SHA1", bdSig: bdSig) success = asnRoot.appendBits(bdSig.getEncoded("base64"), encoding: "base64") asnCertReqInfo = nil // ---------------------------------- // Finally, add the algorithm identifier, which is the 2nd sub-item under the root. // ---------------------------------- var asnAlgId: CkoAsn? = asnRoot.getSubItem(1) success = asnAlgId!.appendOid("1.2.840.113549.1.1.5") success = asnAlgId!.appendNull() asnAlgId = nil // Write the CSR to a DER encoded binary file: success = asnRoot.writeBinaryDer("qa_output/mydomain.csr") if success != true { print("\(asnRoot.lastErrorText!)") return } // It is also possible to get the CSR in base64 format: var csrBase64: String? = asnRoot.getEncodedDer("base64") print("Base64 CSR:") print("\(csrBase64!)") privKey = nil } |
© 2000-2024 Chilkat Software, Inc. All Rights Reserved.