General iOS Server Configurations
This section includes the details on how to generate the Certificate Authority (CA), Registration Authority (RA) and SSL certificate. For more information, check out the subsections given below:
PrerequisitesÂ
Download and install OpenSSL.
Configuring iOS server-side configurations
Follow the instructions below to configure the iOS server-side configurations:
Create a new file namedÂ
openssl.cnf
 in a preferred location.Include the following configurations to theÂ
openssl.cnf
 file, to generate version 3 certificates as shown below:[ v3_req ] # Extensions to add to a certificate request basicConstraints=CA:TRUE keyUsage = digitalSignature, keyEncipherment [ v3_ca ] # Extensions for a typical CA # PKIX recommendation. subjectKeyIdentifier=hash authorityKeyIdentifier=keyid:always,issuer # This is what PKIX recommends but some broken software chokes on critical # extensions. basicConstraints = critical,CA:true # So we do this instead. #basicConstraints = CA:true # Key usage: this is typical for a CA certificate. However since it will # prevent it being used as an test self-signed certificate it is best # left out by default. keyUsage = digitalSignature, keyCertSign, cRLSign
In the location where you modified and saved theÂ
openssl.cnf
 file, run the following commands to generate a self-signed Certificate Authority (CA) certificate (version 3) and convert the certificate to the.pem
 format:Âopenssl genrsa -out <CA PRIVATE KEY> 4096
For example:Âopenssl genrsa -out ca_private.key 4096
openssl req -new -key <CA PRIVATE KEY> -out <CA CSR>
For example:Âopenssl req -new -key ca_private.key -out ca.csr
openssl x509 -req -days <DAYS> -in <CA CSR> -signkey <CA PRIVATE KEY> -out <CA CRT> -extensions v3_ca -extfile <PATH-TO-THE-NEWLY-CREATED-openssl.cnf-FILE>
For example:Âopenssl x509 -req -days 365 -in ca.csr -signkey ca_private.key -out ca.crt -extensions v3_ca -extfile ./openssl.cnf
openssl rsa -in <CA PRIVATE KEY> -text > <CA PRIVATE PEM>
For example:Âopenssl rsa -in ca_private.key -text > ca_private.pem
openssl x509 -in <CA CRT> -out <CA CERT PEM>
For example:Âopenssl x509 -in ca.crt -out ca_cert.pem
In the same location, run the following commands to generate a Registration Authority (RA) certificate (version 3), sign it with the CA, and convert the certificate to theÂ
.pem
 format. Âopenssl genrsa -out <RA PRIVATE KEY> 4096
For example:Âopenssl genrsa -out ra_private.key 4096
openssl req -new -key <RA PRIVATE KEY> -out <RA CSR>
For example:openssl req -new -key ra_private.key -out ra.csr
openssl x509 -req -days <DAYS> -in <RA CSR> -CA <CA CRT> -CAkey <CA PRIVATE KEY> -set_serial <SERIAL NO> -out <RA CRT> -extensions v3_req -extfile <PATH-TO-THE-NEWLY-CREATED-openssl.cnf-FILE>
For example:Âopenssl x509 -req -days 365 -in ra.csr -CA ca.crt -CAkey ca_private.key -set_serial 02 -out ra.crt -extensions v3_req -extfile ./openssl.cnf
openssl rsa -in <CA PRIVATE KEY> -text> <RA PRIVATE PEM>
For example:openssl rsa -in ra_private.key -text > ra_private.pem
openssl x509 -in <RA CRT> -out <RA CERT PEM>
For example:openssl x509 -in ra.crt -out ra_cert.pem
Generate the SSL certificate (version 3)Â based on your domain/IP address:
If you have already obtained an SSL certificate for your domain, you can skip this step and use that SSL certificate in step 7.
- Generate an RSA key.
openssl genrsa -out <RSA_key>.key 4096
For example:
openssl genrsa -out ia.key 4096
- Generate a CSR file.
openssl req -new -key <RSA_key>.key -out <CSR>.csr
For example:
openssl req -new -key ia.key -out ia.csr
Enter your server IP address/domain name (e.g., 192.168.1.157) as the Common Name else provisioning will fail. - Generate the SSL certificate
openssl x509 -req -days 730 -in <CSR>.csr -CA ca_cert.pem -CAkey ca_private.pem -set_serial <serial number> -out ia.crt
For example:Â
openssl x509 -req -days 730 -in ia.csr -CA ca_cert.pem -CAkey ca_private.pem -set_serial 044324343 -out ia.crt
- Generate an RSA key.
Export the SSL, CA and RA files as PKCS12 files with an alias.
Export the SSL file as a PKCS12 file with an "
wso2carbo
n" as the alias.ÂIf you are using intermediate certifications, make sure to create a single certificate file that includes all these certificates by archiving them using the
cat <CERTIFCATE 1> <CERTIFICATE 2> ... >> <CERTIFICATE CHAIN>
command. Use the generated certificate chain for the proceeding step.openssl pkcs12 -export -out <KEYSTORE>.p12 -inkey <RSA_key>.key -in ia.crt -CAfile ca_cert.pem -name "<alias>"
For example:
openssl pkcs12 -export -out KEYSTORE.p12 -inkey ia.key -in ia.crt -CAfile ca_cert.pem -name "wso2carbon"
- Export the CA file as a PKCS12 file with an alias.
openssl pkcs12 -export -out <CA>.p12 -inkey <CA private key>.pem -in <CA Cert>.pem -name "<alias>"
For example:
openssl pkcs12 -export -out ca.p12 -inkey ca_private.pem -in ca_cert.pem -name "cacert"
In the above example,cacert
has been used as the CA alias. - Export the RA file as a PKCS12 file with an alias.
openssl pkcs12 -export -out <RA>.p12 -inkey <RA private key>.pem -in <RA Cert>.pem -chain -CAfile <CA cert>.pem -name "<alias>"
For example:
openssl pkcs12 -export -out ra.p12 -inkey ra_private.pem -in ra_cert.pem -chain -CAfile ca_cert.pem -name "racert"
In the above example,racert
has been used as the RA alias.Â
Why is this step required?
A PKCS12 file is used to store many cryptography objects as a single file. The certificates and their private keys that were generated using the above commands are stored in a PKCS12 file so that it can be imported to the respective KeyStores as shown in step 9.
Copy the three P12 extension files to theÂ
<EMM_HOME>/repository/resources/security
directory.Why is this step required?
TheÂ
<EMM_HOME>/repository/resources/security
 directory is where the WSO2 EMM KeyStores are stored.
Example for KeyStores:wso2carbon.jks
,client-truststore.jks
andwso2certs.jks.
- Import the generated P12 extension files as follows:
Import the generated
<KEYSTORE>.p12
file into thewso2carbon.jks
andclient-truststore.jks
in the <EMM_HOME>/repository/resources/security
directory.
keytool -importkeystore -srckeystore <KEYSTORE>.p12 -srcstoretype PKCS12 -destkeystore <wso2carbon.jks/client-truststore.jks>
For example:
keytool -importkeystore -srckeystore KEYSTORE.p12 -srcstoretype PKCS12 -destkeystore wso2carbon.jks
keytool -importkeystore -srckeystore KEYSTORE.p12 -srcstoretype PKCS12 -destkeystore client-truststore.jks
Import the generatedÂ
<CA>.p12
and<RA>.p12
files into theÂwso2certs.jks
file, which is in the<EMM_HOME>/repository/resources/security
 directory.
keytool -importkeystore -srckeystore <CA/RA>.p12 -srcstoretype PKCS12Â -destkeystore wso2certs.jksÂ
For example:
keytool -importkeystore -srckeystore ca.p12 -srcstoretype PKCS12Â -destkeystore wso2certs.jksÂ
Enter the keystore password aswso2carbon
and the keystore key password asÂcacert
.keytool -importkeystore -srckeystore ra.p12 -srcstoretype PKCS12Â -destkeystore wso2certs.jksÂ
Enter the keystore password asÂwso2carbon
  and the keystore key password asÂracert
Troubleshooting
Why does the following error occur:
"
keytool error: java.io.IOException: Invalid keystore format"
?If you enter the wrong private key password when importing the
<CA>.p12
 orÂ<RA>.p12
 files, thewso2certs.jks
file will get corrupted and the above error message will appear.In such a situation, delete the
wso2certs.jks
file and execute the following command to import the generatedÂ<CA>.p12
 andÂ<RA>.p12
 files into theÂwso2certs.jks
file again.
keytool -importkeystore -srckeystore <CA/RA>.p12 -srcstoretype PKCS12 -destkeystore wso2certs.jks
When the above command is executed, WSO2 EMM will automatically create a newwso2certs.jks
file with the imported file.
The default EMM keystore details are defined under theÂ
<CertificateKeystore>
 XML element in thecertificate-config.xml
file, which is in the<EMM_HOME>/repository/conf
directory. Therefore, if any of the following details are changed, it needs to be reflected in<
CertificateKeystore>
:- Certificate Keystore file location
- Certificate Keystore type
- Certificate Keystore password
- Certificate authority certificate aliasÂ
- Certificate authority private key password
- Registration authority certificate alias
Registration authority private key passwordÂ
Example:
<?xml version="1.0" encoding="ISO-8859-1"?> <CertificateConfigurations> <CertificateKeystore> <!-- Certificate Keystore file location--> <CertificateKeystoreLocation>${carbon.home}/repository/resources/security/wso2certs.jks</CertificateKeystoreLocation> <!-- Certificate Keystore type (JKS/PKCS12 etc.)--> <CertificateKeystoreType>JKS</CertificateKeystoreType> <!-- Certificate Keystore password--> <CertificateKeystorePassword>wso2carbon</CertificateKeystorePassword> <!-- Certificate authority certificate alias --> <CACertAlias>cacert</CACertAlias> <!-- Certificate authority private key password --> <CAPrivateKeyPassword>cacert</CAPrivateKeyPassword> <!-- Registration authority certificate alias --> <RACertAlias>racert</RACertAlias> <!-- Registration authority private key password --> <RAPrivateKeyPassword>racert</RAPrivateKeyPassword> </CertificateKeystore> </CertificateConfigurations>
What's next?
Follow the iOS client configurations. This step is not required if you are not using the WSO2 EMM iOS agent.
If you are not using the WSO2 EMM iOS agent, configure the iOS platform via the WSO2 EMM Console.