2

我正在开发一个将 NetSuite 与沃尔玛市场 API 集成的套件脚本。而且,正如这里的另一个 OP所说的那样,他们的文档几乎说如果您不使用 Java,那么您就只能靠自己了。

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

来自沃尔玛 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;
}

作为参考,这是要求 dot net 的类似内容。任何帮助,将不胜感激。

4

2 回答 2

1

我曾经尝试在 Javascript 中开发 SAML 连接器,并找到了几个处理不同密钥文件格式等的库。我已经走了很长一段路,但是运行一些脚本的时间令人难以置信(想象一下尝试登录但这个过程需要两分钟才能完成确定您的登录是有效的)

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

即使使用 SS 2.0,加密部门的 NS 似乎也没有太大改善。

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

于 2017-02-23T21:00:11.173 回答
0

我找到了一个库(jsrsasign),它可以在 4 秒内从 NetSuite 服务器端完成 Walmart 签名!(市场已转到 OAuth2,但我坚持以 Drop Ship 供应商的身份签名)

/**
 *@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;
于 2019-06-07T17:00:02.137 回答