如何在NetSuite或javascript中解码私钥的BASE64,PCKS-8表示?

时间:2017-02-23 13:10:28

标签: javascript authentication netsuite suitescript walmart-api

我正在使用套件将NetSuite与沃尔玛市场API集成。而且,正如另一个OP here所说的那样,他们的文档很正确地说,如果你不使用Java,那么你自己就可以了。

我正在寻找一种方法来在suitecript或javascript中做同样的事情。

Walmart的API文档说明:

  

通过以下方式对此数据的字节数组表示进行签名:

     

解码Base 64,私钥的PKCS-8表示。请注意,密钥使用PKCS-8编码。各种语言的库提供了指定密钥采用这种格式而不是其他冲突格式(如PKCS-1)的能力。使用密钥的此字节表示形式,使用带有RSA的SHA-256对数据进行签名。使用Base 64对生成的签名进行编码。

并且,他们的文档中的java代码也是这样做的:

 public static String signData(String stringToBeSigned, String encodedPrivateKey) {
    String signatureString = null;
    try {
        byte[] encodedKeyBytes = Base64.decodeBase64(encodedPrivateKey);
        PKCS8EncodedKeySpec privSpec = new PKCS8EncodedKeySpec(encodedKeyBytes);
        KeyFactory kf = KeyFactory.getInstance("RSA");
        PrivateKey myPrivateKey = kf.generatePrivate(privSpec);
        Signature signature = Signature.getInstance("SHA256withRSA");
        signature.initSign(myPrivateKey);
        byte[] data = stringToBeSigned.getBytes("UTF-8");
        signature.update(data);
        byte[] signedBytes = signature.sign();
        signatureString = Base64.encodeBase64String(signedBytes);
    } catch (Exception e) {
        e.printStackTrace();
    }
    return signatureString;
}

供参考,这里是similar thing asked for dot net。任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:1)

我尝试在Javascript中开发一个SAML连接器,并找到了几个处理不同密钥文件格式等的库。我已经相当远但是运行一些脚本的时间令人难以置信(想象一下尝试登录但过程正在进行中两分钟来决定您的登录是否有效)

此时我切换到外部系统并使用Netsuite的入站SSO管理SSO。

即使使用SS 2.0,加密部门的NS看起来并没有那么多改进。

我倾向于把它分成两部分。在Suitescript中生成文件,并通过基于Java的Web服务传递它们,以处理签名要求。最大限度地减少您必须编写的Java数量,并使您的事务提取/格式化脚本易于控制。

答案 1 :(得分:0)

我发现了一个库(jsrsasign),它将在4秒内完成NetSuite服务器端的Walmart签名! (市场已经转到OAuth2,但我仍然坚持作为直接发货供应商进行签名)

/**
 *@NApiVersion 2.x
 *@NScriptType ScheduledScript
 */

define(['N/log', 'N/https', '../lib/jsrsasign-master/jsrsasign-all-min'],
    function(log, https) {
        function execute(context) {
            var pkcs8Der = {Your Walmart Private Key};
            var pkcs8Pem = [
                '-----BEGIN PRIVATE KEY-----',
                pkcs8Der.match(/.{0,64}/g).join('\n'),
                '-----END PRIVATE KEY-----'
            ].join('\n');

            var tStamp = Date.now()
            var stringToSign = [
                tStamp,
                {Your Walmart Comsumer Id},
                {Request URL},
                {Request Method (All Caps)}
            ].join('\n') + '\n';

            var sig = new KJUR.crypto.Signature({"alg": "SHA256withRSA"});
            sig.init(pkcs8Pem);
            var sigVal = hextob64(sig.signString(stringToSign));

            log.audit({title: 'Signature', details: sigVal});
            log.audit({title: 'Timestamp', details: tStamp});
        }

        return {
            execute: execute,
        };
    }
);

我必须将以下代码添加到jsrsasign-all-min.js库文件中,以便计划脚本加载模块:

var navigator = {}, window = undefined;