【问题标题】:How do I decode a BASE64, PCKS-8 representation of a private key in NetSuite or javascript?如何解码 NetSuite 或 javascript 中私钥的 BASE64、PCKS-8 表示?
【发布时间】:2017-02-23 13:10:28
【问题描述】:

我正在开发一个套件脚本,以将 NetSuite 与 Walmart Marketplace API 集成。而且,正如另一位 OP here 所说的那样,他们的文档几乎说如果您不使用 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;
}

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

【问题讨论】:

  • 请从 JavaScript 重新标记为 Java。
  • 我想我只在 javascript 或 Netsuite 中寻求任何帮助。我提供的java代码仅供参考。所以这应该只标记为javascript。如果我错了,请纠正。

标签: javascript authentication netsuite suitescript walmart-api


【解决方案1】:

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

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

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

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

【讨论】:

  • 是的,Java Web 服务可以完成这项工作,但它需要额外的服务器/VM 来托管它。如果我没有在 javascript 或 suitescript 中获得任何其他解决方案,我可能不得不说服客户也这样做。谢谢!
  • 足够的基础设施来运行这个现在相当便宜。 EC2,linode,Heroku,可能 lambda 允许 Java。其中任何一个也可以让您在节点中执行此操作
【解决方案2】:

我找到了一个库 (jsrsasign),它将在 4 秒内从 NetSuite 服务器端完成 Walmart 签名! (Marketplace 已使用 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;

【讨论】:

    猜你喜欢
    • 2016-09-28
    • 2022-10-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-05
    相关资源
    最近更新 更多