Создать самоподписанный сертификат в php - PullRequest
0 голосов
/ 02 марта 2019

У меня есть Java-код, с помощью которого я могу создавать подписанный контент, а с этим подписанным контентом я могу отправить запрос на получение данных.Теперь я хочу преобразовать этот код Java в php, что означает, что я хочу подписать содержимое с помощью php.

Я создал файл сертификата KeyStore.jks с помощью java keytool.

1004 * используется этот Java код для создания знака.
import java.io.FileInputStream;
import java.security.KeyStore;
import java.security.PrivateKey;
import java.security.PublicKey;
import java.security.Security;
import java.security.cert.X509Certificate;
import java.text.SimpleDateFormat;
import java.util.Arrays;
import java.util.Calendar;
import java.util.Enumeration;
import java.util.Base64;

import org.bouncycastle.cert.jcajce.JcaCertStore;
import org.bouncycastle.cms.CMSProcessableByteArray;
import org.bouncycastle.cms.CMSSignedData;
import org.bouncycastle.cms.CMSSignedDataGenerator;
import org.bouncycastle.cms.CMSTypedData;
import org.bouncycastle.cms.jcajce.JcaSimpleSignerInfoGeneratorBuilder;
import org.bouncycastle.util.Store;

//import sun.misc.BASE64Encoder;

public class GenerateSignature {

    private static final char JKSPassword[];
    private static final char PFXPassword[];
    private static KeyStore ks = null;
    private static String alias = null;
    private static X509Certificate UserCert = null;
    private static PrivateKey UserCertPrivKey = null;
    private static PublicKey UserCertPubKey = null;
    private static X509Certificate myPubCert = null;

    static {
        JKSPassword = "nopassword".toCharArray();
        PFXPassword = "tcs".toCharArray();
    }

    public GenerateSignature() {

    }

    public static void main(String[] args) {

        String aspId = "XA5P4RD1823D000785";
        String ts = "";

        ts = getCurrTs();

        System.out.println("AspId : " + aspId);
        System.out.println("TimeStamp : " + ts);

        String aspData = aspId + ts;

        try {
            String sign = generateSignature(aspData);
            System.out.println("sign:" + sign);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public static String generateSignature(String data) throws Exception {

        System.out.println("@@inside generateSignature: " + data);

        String signature;

        String jksFilepath = "C:\\KeyStore.jks";

        try {
            // Adding Security Provider for PKCS 12
            Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider());
            // Setting password for the e-Token

            // logging into token
            ks = KeyStore.getInstance("jks");


            FileInputStream fileInputStream = new FileInputStream(jksFilepath);

            // Loading Keystore
            // System.out.println("loading keystore");
            ks.load(fileInputStream, JKSPassword);
            Enumeration<String> e = ks.aliases();

            while (e.hasMoreElements()) {
                alias = e.nextElement();
                // System.out.println("Alias of the e-Token : "+ alias);

                UserCert = (X509Certificate) ks.getCertificate(alias);

                UserCertPubKey = (PublicKey) ks.getCertificate(alias).getPublicKey();

                // System.out.println("loading Private key");
                UserCertPrivKey = (PrivateKey) ks.getKey(alias, JKSPassword);
            }

            // Method Call to generate Signature
            signature = MakeSignature(data);

            return signature;

        } catch (Exception e) {
            e.printStackTrace();
            System.out.println("generateSignature" + e.getCause());
            throw new Exception();
        }

    }

    private static String MakeSignature(String data) {

        System.out.println("@@inside MakeSignature...");

        try {
            PrivateKey privateKey = (PrivateKey) ks.getKey(alias, JKSPassword);
            System.out.println(privateKey.getEncoded().toString());
            myPubCert = (X509Certificate) ks.getCertificate(alias);
            Store certs = new JcaCertStore(Arrays.asList(myPubCert));

            CMSSignedDataGenerator generator = new CMSSignedDataGenerator();

            generator.addSignerInfoGenerator(new JcaSimpleSignerInfoGeneratorBuilder().setProvider("BC").build("SHA256withRSA", privateKey, myPubCert));

            generator.addCertificates(certs);

            CMSTypedData data1 = new CMSProcessableByteArray(data.getBytes());

            CMSSignedData signed = generator.generate(data1, true);

            //BASE64Encoder encoder = new BASE64Encoder();

            //String signedContent = encoder.encode((byte[]) signed.getSignedContent().getContent());

            //String envelopedData = encoder.encode(signed.getEncoded());
            String envelopedData = Base64.getEncoder().encodeToString(signed.getEncoded());

            return envelopedData;
        } catch (Exception e) {
            e.printStackTrace();
            System.out.println("MakeSignature ==" + e.getCause());
            return "";
        }
    }

    public static String getCurrTs() {
        System.out.println("@@inside getCurrTs...");
        Calendar cal = Calendar.getInstance();
        SimpleDateFormat format1 = new SimpleDateFormat("ddMMyyyyHHmmssSSS111");
        String tmpstmp = format1.format(cal.getTime());
        return tmpstmp;
    }

}

Это дает мне выход, как

/ kQGe8erpXGPb6Iqv2NNY7mPj3GdUTrnofse2FVUvrdt1WtqYYQ3ldBnDfWGYxadmzjSgtkOSl2ozFl8fuYstqye08XSovvY5fsGi + JS9RhW65WtvkL / TEQaezutgdJe / p3lc5eQB09fwhgbDRo4eusy8iigap3yR67rNFkPafACwalm0u0T8jojo + 1auM9JXL2waUsDgJmROyUOSG9EXhbday27UsK + oo3 +Fwd / RRcj7PNSERsnRV8IqVf40vnQIDAQABoyEwHzAdBgNVHQ4EFgQU3Qqp9L1zyptxSv4lLFcQgXFBN4owDQYJKoZIhvcNAQELBQADggEBAECqBuB48sJdaflo6EVEpGXdpt8bv9qCHIIrUBnfas + FOsy6ag / njH2K1NNV8iy3oPh5cTQiUf22KliW2pYRMELN0bC32XNHnmHZPFzbcGhhkvj39lF3Y4l9Z8MT9boueFV3u3s8dETb99fmbiwT3uSrdbJix + lmFJNoHr0Gq / SWxcVmdO7Qbk0yEHUbqNNXxf1U / ozCXC4PtlAfPIfFZ7LFXp7YwboXrZlObkC2rsEWyvAojUJ8FVhxyRBhu7pHIdqKXdCwFeiSfGJKrx9lNhhmlunBSGdWAgydKzlREx + Hfw0nycy98PfFh3Cz1tUtARL5w / г ++ 5sJDnqSDx1MzRilcy0hg8K + d + / E75P8 / lZ31oa / He4G3TC703ghOgiRIwsaSgaS2Yg5mkKn9GlVzCPosVKRnODLjGwj + C / ofZjK7M0KeFK0Lf6YVF6fxsTE1UwGOKbZ1kKYOq + 6fPxvDnfPVhuKSvjRJJ9UHws7TBeEZWFCRzI1ud1nOqCg7lvMe / DjnypOSN2td6oAE2opubOR8KPCmh9XoTb0R2lJ9cYFdEdzvB4n5Q8aTvYz2dQvVOv7q8jkrntLW8lK + OV + LrVVqp + Cx8HtfKrt6NLUJ2i302SuawItC7SsEXH4AhiUX0AAAAAAAAA3 * * 101 * * 101 * * * * * = *Я хочу PHP-код, который сделает это для меня.Что я имею в виду, PHP не имеет возможности получить содержимое из JKS-файла , поэтому я преобразовал jks-файл в pfx .используя команду.

keytool -importkeystore -srckeystore KeyStore.jks -destkeystore mynewPfx.pfx -srcstoretype JKS -d eststoretype PKCS12 -deststorepass xxxxxx -srcalias domain -destalias domain -keysize 2040 1040 204040

это дало мне pfx файл.теперь подписал содержание я использовать OpenSSL в PHP-код.

<?php date_default_timezone_set("Asia/Kolkata");
//data you want to sign
$date=date('dmYHisnnnnnn');
$aspid="XA5P4RD1823D000785";
$data = $aspid.$date;
$cert_store = file_get_contents("mynewPfx.pfx");
openssl_pkcs12_read($cert_store, $cert_info, "nopassword");
//var_dump($cert_info);
//create signature
openssl_sign($data, $signature, $cert_info['pkey'], "sha256WithRSAEncryption");

//finally encode
$r = base64_encode($signature);
echo '<br>';
print "sign: ".$r;
?>

это дает мне знак содержание как.

KiadpEipXMbvGQq5YJvMKfvGnm + 3czL40IXMR8GQM1XTheHsbhoTVbUpkGWh6yOMBUGg4FtWlucX2tpZfTC + Pin8DBqrUzxd3PBuFoyx7a / BHRVL / E8iq / 7yGM / s0fT3GqH68SmGSgiP84+ Pfnje4s + 46d1Q6wZds2Pr9LWdmuE3XrzMl + x8D6xfXf / SDSQHUs77V9NQ1nH9w7va9XuNdGCjJQIoA9iIaJUdQJdvwbwrtK5shnUWKJg2A9xKPgJsH0zqjdijTXog6 + kC2ghDlFli5vrgBluDj483ykcU / HNqDhfOkGdcBZ8H6x5VjD2oyhskyiAM0iDW02WgGVH6BA ==

PHP дает мне знак содержание, но это разные.это означает, что это не соответствует выводу Java.а также длина также мала.у любого есть какая-либо опция.чтобы достичь этого.

...