腾讯云通信生成签名时异常,ECDSA KeyFactory not available?

  • 回答 (1)
  • 关注 (0)
  • 查看 (230)

腾讯云通信生成签名时异常:

Caused by: java.security.NoSuchAlgorithmException: ECDSA KeyFactory not available

at java.security.KeyFactory.<init>(KeyFactory.java:138)

at java.security.KeyFactory.getInstance(KeyFactory.java:172)

代码:

/**
	 * @brief 生成 tls 票据,精简参数列表
	 * @param skdAppid 应用的 sdkappid
	 * @param identifier 用户 id
	 * @param privStr 私钥文件内容
	 * @param expire 有效期,以秒为单位,推荐时长一个月
	 * @return
	 * @throws IOException
	 */
	public static GenTLSSignatureResult GenTLSSignatureEx(
			long skdAppid,
			String identifier,
			String privStr,
			long expire) throws IOException {

		GenTLSSignatureResult result = new GenTLSSignatureResult();
		
        Security.addProvider(new BouncyCastleProvider());
        Reader reader = new CharArrayReader(privStr.toCharArray());
        JcaPEMKeyConverter converter = new JcaPEMKeyConverter();
        PEMParser parser = new PEMParser(reader);
        Object obj = parser.readObject();
        parser.close();
        
        //发生异常的代码  *******************
    	PrivateKey privKeyStruct = converter.getPrivateKey((PrivateKeyInfo) obj);
    		//   ****************************************
    
		String jsonString = "{" 
		+ "\"TLS.account_type\":\"" + 0 +"\","
		+"\"TLS.identifier\":\"" + identifier +"\","
		+"\"TLS.appid_at_3rd\":\"" + 0 +"\","
	    +"\"TLS.sdk_appid\":\"" + skdAppid +"\","
		+"\"TLS.expire_after\":\"" + expire +"\","
        +"\"TLS.version\": \"201512300000\""
		+"}";
		
		String time = String.valueOf(System.currentTimeMillis()/1000);
		String SerialString = 
			"TLS.appid_at_3rd:" + 0 + "\n" +
			"TLS.account_type:" + 0 + "\n" +
			"TLS.identifier:" + identifier + "\n" + 
			"TLS.sdk_appid:" + skdAppid + "\n" + 
			"TLS.time:" + time + "\n" +
			"TLS.expire_after:" + expire +"\n";
		
		try {
			//Create Signature by SerialString
			Signature signature = Signature.getInstance("SHA256withECDSA", "BC");
			signature.initSign(privKeyStruct);
			signature.update(SerialString.getBytes(Charset.forName("UTF-8")));
			byte[] signatureBytes = signature.sign();
			
			String sigTLS = Base64.encodeBase64String(signatureBytes);
			
			//Add TlsSig to jsonString
		    JSONObject jsonObject= new JSONObject(jsonString);
		    jsonObject.put("TLS.sig", (Object)sigTLS);
		    jsonObject.put("TLS.time", (Object)time);
		    jsonString = jsonObject.toString();
		    
		    //compression
		    Deflater compresser = new Deflater();
		    compresser.setInput(jsonString.getBytes(Charset.forName("UTF-8")));

		    compresser.finish();
		    byte [] compressBytes = new byte [512];
		    int compressBytesLength = compresser.deflate(compressBytes);
		    compresser.end();
		    String userSig = new String(base64_url.base64EncodeUrl(Arrays.copyOfRange(compressBytes,0,compressBytesLength)));
    
		    result.urlSig = userSig;
		}
		catch(Exception e)
		{
			e.printStackTrace();
			result.errMessage = "generate usersig failed";
		}
		
		return result;
	}

生成签名的代码都是官方的没有动过,在IDEA编译和运行,以及在自己电脑tomcat上运行时没有任何问题,但当部署到linux服务器上时就异常了,有大神能帮忙看一下吗?呜呜呜呜

linux环境:JDK 1.8,tomcat 8.5

用户3076131用户3076131提问于
o o回答于

检查私钥是否正确(如:私钥是否完整、私钥是否有换行、私钥是否为下载的私钥等)。

可能回答问题的人

  • 腾讯云CDN团队

    6 粉丝0 提问8 回答
  • 腾讯云技术服务团队

    腾讯云 · 技术服务团队 (已认证)

    21 粉丝0 提问3 回答
  • 宝哥@devops运维

    腾讯 · 高级云计算工程师 (已认证)

    64 粉丝0 提问0 回答
  • elliswu

    腾讯计算机系统有限公司 · 高级工程师 (已认证)

    4 粉丝0 提问0 回答
  • selenawang

    0 粉丝0 提问0 回答
  • squall

    腾讯 · 高级产品经理 (已认证)

    2 粉丝0 提问3 回答

扫码关注云+社区

领取腾讯云代金券