瀏覽代碼

!2 合并 jetbrains_merge 分支到 master
Merge pull request !2 from backflow/master

backflow 8 年之前
父節點
當前提交
03d4a2e513

+ 5 - 3
README.md

@@ -1,6 +1,6 @@
-# Jrebel License Server for Java
+# Jrebel & Jet Brains License Server for Java
 
-A license server for Jrebel products, it also support JRebel for Android and XRebel.
+A license server for Jrebel & JetBrains products, it also support JRebel for Android and XRebel.
 
 ***
 Thank ilanyu
@@ -20,7 +20,7 @@ mvn package
 ```
 then
 ```
-java -jar JrebelLicenseServerforJava-1.0-SNAPSHOT-jar-with-dependencies.jar -p 8081
+java -jar JrebelBrainsLicenseServerforJava-1.0-SNAPSHOT-jar-with-dependencies.jar -p 8081
 ```
 default port is 8081.
 
@@ -32,6 +32,8 @@ JRebel for Android
 
 XRebel
 
+JetBrains Products
+
 ## Feedback
 
 + issue: https://gitee.com/gsls200808/JrebelLicenseServerforJava/issues

+ 10 - 12
pom.xml

@@ -5,7 +5,7 @@
   <modelVersion>4.0.0</modelVersion>
 
   <groupId>com.vvvtimes.com</groupId>
-  <artifactId>JrebelLicenseServerforJava</artifactId>
+  <artifactId>JrebelBrainsLicenseServerforJava</artifactId>
   <version>1.0-SNAPSHOT</version>
 
   <properties>
@@ -14,19 +14,19 @@
 
   <build>
     <plugins>
-
       <plugin>
         <groupId>org.apache.maven.plugins</groupId>
         <artifactId>maven-compiler-plugin</artifactId>
         <!-- 与Servlet版本对应 -->
         <version>3.1</version>
         <configuration>
-          <source>1.7</source>
-          <target>1.7</target>
+          <source>1.6</source>
+          <target>1.6</target>
           <encoding>utf8</encoding>
         </configuration>
       </plugin>
 
+      <!-- 打包可运行jar包 -->
       <plugin>
         <groupId>org.apache.maven.plugins</groupId>
         <artifactId>maven-assembly-plugin</artifactId>
@@ -51,7 +51,6 @@
           </execution>
         </executions>
       </plugin>
-
     </plugins>
   </build>
 
@@ -71,9 +70,9 @@
     </dependency>
 
     <dependency>
-      <groupId>org.apache.commons</groupId>
-      <artifactId>commons-lang3</artifactId>
-      <version>3.1</version>
+      <groupId>org.bouncycastle</groupId>
+      <artifactId>bcprov-jdk15on</artifactId>
+      <version>1.58</version>
     </dependency>
 
     <dependency>
@@ -90,12 +89,11 @@
     </dependency>
 
     <dependency>
-      <groupId>org.bouncycastle</groupId>
-      <artifactId>bcprov-jdk15on</artifactId>
-      <version>1.58</version>
+      <groupId>org.apache.commons</groupId>
+      <artifactId>commons-lang3</artifactId>
+      <version>3.1</version>
     </dependency>
 
   </dependencies>
 
-
 </project>

+ 222 - 157
src/main/java/com/vvvtimes/server/MainServer.java

@@ -1,158 +1,223 @@
-package com.vvvtimes.server;
-
-import com.vvvtimes.JrebelUtil.JrebelSign;
-import net.sf.json.JSONObject;
-
-import java.io.IOException;
-import java.text.SimpleDateFormat;
-import java.util.*;
-
-import javax.servlet.ServletException;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-
-import org.eclipse.jetty.server.Request;
-import org.eclipse.jetty.server.Server;
-import org.eclipse.jetty.server.handler.AbstractHandler;
-
-public class MainServer extends AbstractHandler {
-
-
-    public static Map<String, String> parseArguments(String[] args) {
-        Map<String, String> params = new HashMap<>();
-
-        String option = null;
-        for (final String arg : args) {
-            if (arg.charAt(0) == '-') {
-                if (arg.length() < 2) {
-                    throw new IllegalArgumentException("Error at argument " + arg);
-                }
-                option = arg.substring(1);
-            } else {
-                params.put(option, arg);
-            }
-        }
-        return params;
-    }
-
-    public static void main(String[] args) throws Exception {
-        Map<String, String> arguments = parseArguments(args);
-        String port = arguments.get("p");
-
-        if (port == null || !port.matches("\\d+")) {
-            port = "8081";
-        }
-
-        Server server = new Server(Integer.parseInt(port));
-        server.setHandler(new MainServer());
-        server.start();
-
-        System.out.println("License Server started at http://localhost:" + port);
-        System.out.println("Activation address was: http://localhost:" + port + "/{tokenname}, with any email.");
-
-        server.join();
-    }
-
-    public void handle(String target, Request baseRequest, HttpServletRequest request, HttpServletResponse response)
-            throws IOException, ServletException {
-        System.out.println(target);
-        if (target.equals("/")) {
-            indexHandler(target, baseRequest, request, response);
-        } else if (target.equals("/jrebel/leases")) {
-            jrebelLeasesHandler(target, baseRequest, request, response);
-        } else if (target.equals("/jrebel/leases/1")) {
-            jrebelLeases1Handler(target, baseRequest, request, response);
-        } else if (target.equals("/agent/leases")) {
-            jrebelLeasesHandler(target, baseRequest, request, response);
-        } else if (target.equals("/agent/leases/1")) {
-            jrebelLeases1Handler(target, baseRequest, request, response);
-        } else {
-            response.setStatus(HttpServletResponse.SC_FORBIDDEN);
-        }
-
-    }
-
-    private void jrebelLeases1Handler(String target, Request baseRequest, HttpServletRequest request, HttpServletResponse response) throws IOException {
-        response.setContentType("application/json; charset=utf-8");
-        response.setStatus(HttpServletResponse.SC_OK);
-        baseRequest.setHandled(true);
-        String jsonStr = "{\n" +
-                "    \"serverVersion\": \"3.2.4\",\n" +
-                "    \"serverProtocolVersion\": \"1.1\",\n" +
-                "    \"serverGuid\": \"a1b4aea8-b031-4302-b602-670a990272cb\",\n" +
-                "    \"groupType\": \"managed\",\n" +
-                "    \"statusCode\": \"SUCCESS\",\n" +
-                "    \"msg\": null,\n" +
-                "    \"statusMessage\": null\n" +
-                "}\n";
-        JSONObject jsonObject = JSONObject.fromObject(jsonStr);
-        String body = jsonObject.toString();
-        response.getWriter().print(body);
-
-    }
-
-    private void jrebelLeasesHandler(String target, Request baseRequest, HttpServletRequest request, HttpServletResponse response) throws IOException {
-        response.setContentType("application/json; charset=utf-8");
-        response.setStatus(HttpServletResponse.SC_OK);
-        String clientRandomness = request.getParameter("randomness");
-        String username = request.getParameter("username");
-        String guid = request.getParameter("guid");
-        System.out.println(((Request) request).getParameters());
-        boolean offline = Boolean.parseBoolean(request.getParameter("offline"));
-        String validFrom = "null";
-        String validUntil = "null";
-        if (offline) {
-            String clientTime = request.getParameter("clientTime");
-            String offlineDays = request.getParameter("offlineDays");
-            //long clinetTimeUntil = Long.parseLong(clientTime) + Long.parseLong(offlineDays)  * 24 * 60 * 60 * 1000;
-            long clinetTimeUntil = Long.parseLong(clientTime) + 180L * 24 * 60 * 60 * 1000;
-            validFrom = clientTime;
-            validUntil = String.valueOf(clinetTimeUntil);
-        }
-        baseRequest.setHandled(true);
-        String jsonStr = "{\n" +
-                "    \"serverVersion\": \"3.2.4\",\n" +
-                "    \"serverProtocolVersion\": \"1.1\",\n" +
-                "    \"serverGuid\": \"a1b4aea8-b031-4302-b602-670a990272cb\",\n" +
-                "    \"groupType\": \"managed\",\n" +
-                "    \"id\": 1,\n" +
-                "    \"licenseType\": 1,\n" +
-                "    \"evaluationLicense\": false,\n" +
-                "    \"signature\": \"OJE9wGg2xncSb+VgnYT+9HGCFaLOk28tneMFhCbpVMKoC/Iq4LuaDKPirBjG4o394/UjCDGgTBpIrzcXNPdVxVr8PnQzpy7ZSToGO8wv/KIWZT9/ba7bDbA8/RZ4B37YkCeXhjaixpmoyz/CIZMnei4q7oWR7DYUOlOcEWDQhiY=\",\n" +
-                "    \"serverRandomness\": \"H2ulzLlh7E0=\",\n" +
-                "    \"seatPoolType\": \"standalone\",\n" +
-                "    \"statusCode\": \"SUCCESS\",\n" +
-                "    \"offline\": " + String.valueOf(offline) + ",\n" +
-                "    \"validFrom\": " + validFrom + ",\n" +
-                "    \"validUntil\": " + validUntil + ",\n" +
-                "    \"company\": \"Administrator\",\n" +
-                "    \"orderId\": \"\",\n" +
-                "    \"zeroIds\": [\n" +
-                "        \n" +
-                "    ],\n" +
-                "    \"licenseValidFrom\": 1490544001000,\n" +
-                "    \"licenseValidUntil\": 1691839999000\n" +
-                "}";
-
-        JSONObject jsonObject = JSONObject.fromObject(jsonStr);
-        if (clientRandomness == null || username == null || guid == null) {
-            response.setStatus(HttpServletResponse.SC_FORBIDDEN);
-        } else {
-            JrebelSign jrebelSign = new JrebelSign();
-            jrebelSign.toLeaseCreateJson(clientRandomness, guid, offline, validFrom, validUntil);
-            String signature = jrebelSign.getSignature();
-            jsonObject.put("signature", signature);
-            jsonObject.put("company", username);
-            String body = jsonObject.toString();
-            response.getWriter().print(body);
-        }
-    }
-
-    private void indexHandler(String target, Request baseRequest, HttpServletRequest request, HttpServletResponse response) throws IOException {
-        response.setContentType("text/html; charset=utf-8");
-        response.setStatus(HttpServletResponse.SC_OK);
-        baseRequest.setHandled(true);
-        response.getWriter().println("<h1>Hello,This is a Jrebel License Server!</h1>");
-
-    }
+package com.vvvtimes.server;
+
+import com.vvvtimes.JrebelUtil.JrebelSign;
+import com.vvvtimes.util.rsasign;
+import net.sf.json.JSONObject;
+
+import java.io.IOException;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.Locale;
+import java.util.Map;
+
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.eclipse.jetty.server.Request;
+import org.eclipse.jetty.server.Server;
+import org.eclipse.jetty.server.handler.AbstractHandler;
+
+public class MainServer extends AbstractHandler {
+
+    public static Map<String, String> parseArguments(String[] args) {
+        Map<String, String> params = new HashMap<String, String>();
+
+        String option = null;
+        for (final String arg : args) {
+            if (arg.charAt(0) == '-') {
+                if (arg.length() < 2) {
+                    throw new IllegalArgumentException("Error at argument " + arg);
+                }
+                option = arg.substring(1);
+            } else {
+                params.put(option, arg);
+            }
+        }
+        return params;
+    }
+
+    public static void main(String[] args) throws Exception {
+        Map<String, String> arguments = parseArguments(args);
+        String port = arguments.get("p");
+
+        if (port == null || !port.matches("\\d+")) {
+            port = "8081";
+        }
+
+        Server server = new Server(Integer.parseInt(port));
+        server.setHandler(new MainServer());
+        server.start();
+
+        System.out.println("License Server started at http://localhost:" + port);
+        System.out.println("JetBrains Activation address was: http://localhost:" + port + "/{tokenname}, with any email.");
+        System.out.println("JRebel Activation address was: http://localhost:" + port + "/{tokenname}, with any email.");
+
+        server.join();
+    }
+
+
+    public void handle(String target, Request baseRequest, HttpServletRequest request, HttpServletResponse response)
+            throws IOException, ServletException {
+        System.out.println(target);
+        if (target.equals("/")) {
+            indexHandler(target, baseRequest, request, response);
+        } else if (target.equals("/jrebel/leases")) {
+            jrebelLeasesHandler(target, baseRequest, request, response);
+        } else if (target.equals("/jrebel/leases/1")) {
+            jrebelLeases1Handler(target, baseRequest, request, response);
+        } else if (target.equals("/agent/leases")) {
+            jrebelLeasesHandler(target, baseRequest, request, response);
+        } else if (target.equals("/agent/leases/1")) {
+            jrebelLeases1Handler(target, baseRequest, request, response);
+        } else if (target.equals("/rpc/ping.action")) {
+            pingHandler(target, baseRequest, request, response);
+        } else if (target.equals("/rpc/obtainTicket.action")) {
+            obtainTicketHandler(target, baseRequest, request, response);
+        } else if (target.equals("/rpc/releaseTicket.action")) {
+            releaseTicketHandler(target, baseRequest, request, response);
+        } else {
+            response.setStatus(HttpServletResponse.SC_FORBIDDEN);
+        }
+    }
+
+    private void jrebelLeases1Handler(String target, Request baseRequest, HttpServletRequest request, HttpServletResponse response) throws IOException {
+        response.setContentType("application/json; charset=utf-8");
+        response.setStatus(HttpServletResponse.SC_OK);
+        baseRequest.setHandled(true);
+        String jsonStr = "{\n" +
+                "    \"serverVersion\": \"3.2.4\",\n" +
+                "    \"serverProtocolVersion\": \"1.1\",\n" +
+                "    \"serverGuid\": \"a1b4aea8-b031-4302-b602-670a990272cb\",\n" +
+                "    \"groupType\": \"managed\",\n" +
+                "    \"statusCode\": \"SUCCESS\",\n" +
+                "    \"msg\": null,\n" +
+                "    \"statusMessage\": null\n" +
+                "}\n";
+        JSONObject jsonObject = JSONObject.fromObject(jsonStr);
+        String body = jsonObject.toString();
+        response.getWriter().print(body);
+
+    }
+
+    private void jrebelLeasesHandler(String target, Request baseRequest, HttpServletRequest request, HttpServletResponse response) throws IOException {
+        response.setContentType("application/json; charset=utf-8");
+        response.setStatus(HttpServletResponse.SC_OK);
+        String clientRandomness = request.getParameter("randomness");
+        String username = request.getParameter("username");
+        String guid = request.getParameter("guid");
+        System.out.println(((Request) request).getParameters());
+        boolean offline = Boolean.parseBoolean(request.getParameter("offline"));
+        String validFrom = "null";
+        String validUntil = "null";
+        if (offline) {
+            String clientTime = request.getParameter("clientTime");
+            String offlineDays = request.getParameter("offlineDays");
+            //long clinetTimeUntil = Long.parseLong(clientTime) + Long.parseLong(offlineDays)  * 24 * 60 * 60 * 1000;
+            long clinetTimeUntil = Long.parseLong(clientTime) + 180L * 24 * 60 * 60 * 1000;
+            validFrom = clientTime;
+            validUntil = String.valueOf(clinetTimeUntil);
+        }
+        baseRequest.setHandled(true);
+        String jsonStr = "{\n" +
+                "    \"serverVersion\": \"3.2.4\",\n" +
+                "    \"serverProtocolVersion\": \"1.1\",\n" +
+                "    \"serverGuid\": \"a1b4aea8-b031-4302-b602-670a990272cb\",\n" +
+                "    \"groupType\": \"managed\",\n" +
+                "    \"id\": 1,\n" +
+                "    \"licenseType\": 1,\n" +
+                "    \"evaluationLicense\": false,\n" +
+                "    \"signature\": \"OJE9wGg2xncSb+VgnYT+9HGCFaLOk28tneMFhCbpVMKoC/Iq4LuaDKPirBjG4o394/UjCDGgTBpIrzcXNPdVxVr8PnQzpy7ZSToGO8wv/KIWZT9/ba7bDbA8/RZ4B37YkCeXhjaixpmoyz/CIZMnei4q7oWR7DYUOlOcEWDQhiY=\",\n" +
+                "    \"serverRandomness\": \"H2ulzLlh7E0=\",\n" +
+                "    \"seatPoolType\": \"standalone\",\n" +
+                "    \"statusCode\": \"SUCCESS\",\n" +
+                "    \"offline\": " + String.valueOf(offline) + ",\n" +
+                "    \"validFrom\": " + validFrom + ",\n" +
+                "    \"validUntil\": " + validUntil + ",\n" +
+                "    \"company\": \"Administrator\",\n" +
+                "    \"orderId\": \"\",\n" +
+                "    \"zeroIds\": [\n" +
+                "        \n" +
+                "    ],\n" +
+                "    \"licenseValidFrom\": 1490544001000,\n" +
+                "    \"licenseValidUntil\": 1691839999000\n" +
+                "}";
+
+        JSONObject jsonObject = JSONObject.fromObject(jsonStr);
+        if (clientRandomness == null || username == null || guid == null) {
+            response.setStatus(HttpServletResponse.SC_FORBIDDEN);
+        } else {
+            JrebelSign jrebelSign = new JrebelSign();
+            jrebelSign.toLeaseCreateJson(clientRandomness, guid, offline, validFrom, validUntil);
+            String signature = jrebelSign.getSignature();
+            jsonObject.put("signature", signature);
+            jsonObject.put("company", username);
+            String body = jsonObject.toString();
+            response.getWriter().print(body);
+        }
+    }
+
+    private void releaseTicketHandler(String target, Request baseRequest, HttpServletRequest request, HttpServletResponse response) throws IOException{
+        response.setContentType("text/html; charset=utf-8");
+        response.setStatus(HttpServletResponse.SC_OK);
+        String salt = request.getParameter("salt");
+        baseRequest.setHandled(true);
+        if(salt==null){
+            response.setStatus(HttpServletResponse.SC_FORBIDDEN);
+        }else{
+            String xmlContent = "<ReleaseTicketResponse><message></message><responseCode>OK</responseCode><salt>" + salt + "</salt></ReleaseTicketResponse>";
+            String xmlSignature = rsasign.Sign(xmlContent);
+            String body = "<!-- " + xmlSignature + " -->\n" + xmlContent;
+            response.getWriter().print(body);
+        }
+    }
+
+    private void obtainTicketHandler ( String target , Request baseRequest , HttpServletRequest request ,
+                                       HttpServletResponse response ) throws IOException
+    {
+        response.setContentType("text/html; charset=utf-8");
+        response.setStatus(HttpServletResponse.SC_OK);
+        SimpleDateFormat fm=new SimpleDateFormat("EEE,d MMM yyyy hh:mm:ss Z", Locale.ENGLISH);
+        String date =fm.format(new Date())+" GMT";
+        //response.setHeader("Date", date);
+        //response.setHeader("Server", "fasthttp");
+        String salt = request.getParameter("salt");
+        String username = request.getParameter("userName");
+        String prolongationPeriod = "607875500";
+        baseRequest.setHandled(true);
+        if(salt==null||username==null){
+            response.setStatus(HttpServletResponse.SC_FORBIDDEN);
+        }else{
+            String xmlContent = "<ObtainTicketResponse><message></message><prolongationPeriod>" + prolongationPeriod + "</prolongationPeriod><responseCode>OK</responseCode><salt>" + salt + "</salt><ticketId>1</ticketId><ticketProperties>licensee=" + username + "\tlicenseType=0\t</ticketProperties></ObtainTicketResponse>";
+            String xmlSignature = rsasign.Sign(xmlContent);
+            String body = "<!-- " + xmlSignature + " -->\n" + xmlContent;
+            response.getWriter().print(body);
+        }
+    }
+
+    private void pingHandler ( String target , Request baseRequest , HttpServletRequest request , HttpServletResponse response ) throws IOException
+    {
+        response.setContentType("text/html; charset=utf-8");
+        response.setStatus(HttpServletResponse.SC_OK);
+        String salt = request.getParameter("salt");
+        baseRequest.setHandled(true);
+        if(salt==null){
+            response.setStatus(HttpServletResponse.SC_FORBIDDEN);
+        }else{
+            String xmlContent = "<PingResponse><message></message><responseCode>OK</responseCode><salt>" + salt + "</salt></PingResponse>";
+            String xmlSignature = rsasign.Sign(xmlContent);
+            String body = "<!-- " + xmlSignature + " -->\n" + xmlContent;
+            response.getWriter().print(body);
+        }
+
+    }
+
+    private void indexHandler(String target, Request baseRequest, HttpServletRequest request, HttpServletResponse response) throws IOException {
+        response.setContentType("text/html; charset=utf-8");
+        response.setStatus(HttpServletResponse.SC_OK);
+        baseRequest.setHandled(true);
+        response.getWriter().println("<h1>Hello,This is a Jrebel & JetBrains License Server!</h1>");
+
+    }
 }

+ 25 - 0
src/main/java/com/vvvtimes/util/Base64.java

@@ -0,0 +1,25 @@
+package com.vvvtimes.util;
+
+
+public class Base64 {
+	/**
+	 * 编码
+	 * 
+	 * @param bstr
+	 * @return String
+	 */
+	public static String encode(byte[] bstr) {
+		return org.apache.commons.codec.binary.Base64.encodeBase64String(bstr);
+	}
+
+	/**
+	 * 解码
+	 * 
+	 * @param str
+	 * @return string
+	 */
+	public static byte[] decode(String str) {
+		return org.apache.commons.codec.binary.Base64.decodeBase64(str);
+	}
+
+}

+ 42 - 0
src/main/java/com/vvvtimes/util/Hex.java

@@ -0,0 +1,42 @@
+package com.vvvtimes.util;
+
+public class Hex {
+	public static String bytesToHexString(byte[] src){   
+	    StringBuilder stringBuilder = new StringBuilder("");   
+	    if (src == null || src.length <= 0) {   
+	        return null;   
+	    }   
+	    for (int i = 0; i < src.length; i++) {   
+	        int v = src[i] & 0xFF;   
+	        String hv = Integer.toHexString(v);   
+	        if (hv.length() < 2) {   
+	            stringBuilder.append(0);   
+	        }   
+	        stringBuilder.append(hv);   
+	    }   
+	    return stringBuilder.toString();   
+	}   
+	/**  
+	 * Convert hex string to byte[]  
+	 * @param hexString the hex string  
+	 * @return byte[]  
+	 */  
+	public static byte[] hexStringToBytes(String hexString) {   
+	    if (hexString == null || hexString.equals("")) {   
+	        return null;   
+	    }   
+	    hexString = hexString.toUpperCase();   
+	    int length = hexString.length() / 2;   
+	    char[] hexChars = hexString.toCharArray();   
+	    byte[] d = new byte[length];   
+	    for (int i = 0; i < length; i++) {   
+	        int pos = i * 2;   
+	        d[i] = (byte) (charToByte(hexChars[pos]) << 4 | charToByte(hexChars[pos + 1]));   
+	    }   
+	    return d;   
+	}  
+	private static byte charToByte(char c) {   
+	    return (byte) "0123456789ABCDEF".indexOf(c);   
+	}  
+
+}

+ 98 - 0
src/main/java/com/vvvtimes/util/rsasign.java

@@ -0,0 +1,98 @@
+package com.vvvtimes.util;
+
+import org.bouncycastle.asn1.ASN1InputStream;
+import org.bouncycastle.asn1.ASN1Primitive;
+import org.bouncycastle.asn1.pkcs.RSAPrivateKeyStructure;
+
+import java.security.KeyFactory;
+import java.security.PrivateKey;
+import java.security.spec.PKCS8EncodedKeySpec;
+import java.security.spec.RSAPrivateKeySpec;
+
+
+public class rsasign {
+    static String header = "<!-- 537606aed546c5ba42c0820ad7fd0d74ee7caf90c232a484d0464b3332c42a9189555aebdba3570fe6566842ba7b7bb88da360f202ae9536a2a12fcdf39600c7 --><ObtainTicketResponse><message></message><prolongationPeriod>607875500</prolongationPeriod><responseCode>OK</responseCode><salt>1508484258274</salt><ticketId>1</ticketId><ticketProperties>licensee=Administrator    licenseType=0   </ticketProperties></ObtainTicketResponse>";
+    static String content = "<ObtainTicketResponse><message></message><prolongationPeriod>607875500</prolongationPeriod><responseCode>OK</responseCode><salt>1508484258274</salt><ticketId>1</ticketId><ticketProperties>licensee=Administrator    licenseType=0   </ticketProperties></ObtainTicketResponse>";
+    String ASNKEY = "-----BEGIN RSA PRIVATE KEY-----\r\n"
+            + "MIIBOgIBAAJBALecq3BwAI4YJZwhJ+snnDFj3lF3DMqNPorV6y5ZKXCiCMqj8OeOmxk4YZW9aaV9\r\n"
+            + "ckl/zlAOI0mpB3pDT+Xlj2sCAwEAAQJAW6/aVD05qbsZHMvZuS2Aa5FpNNj0BDlf38hOtkhDzz/h\r\n"
+            + "kYb+EBYLLvldhgsD0OvRNy8yhz7EjaUqLCB0juIN4QIhAOeCQp+NXxfBmfdG/S+XbRUAdv8iHBl+\r\n"
+            + "F6O2wr5fA2jzAiEAywlDfGIl6acnakPrmJE0IL8qvuO3FtsHBrpkUuOnXakCIQCqdr+XvADI/UTh\r\n"
+            + "TuQepuErFayJMBSAsNe3NFsw0cUxAQIgGA5n7ZPfdBi3BdM4VeJWb87WrLlkVxPqeDSbcGrCyMkC\r\n"
+            + "IFSs5JyXvFTreWt7IQjDssrKDRIPmALdNjvfETwlNJyY\r\n"
+            + "-----END RSA PRIVATE KEY-----";
+    String PCKS8KEY = "-----BEGIN PRIVATE KEY-----\r\n"
+            + "MIIBVAIBADANBgkqhkiG9w0BAQEFAASCAT4wggE6AgEAAkEAt5yrcHAAjhglnCEn\r\n"
+            + "6yecMWPeUXcMyo0+itXrLlkpcKIIyqPw546bGThhlb1ppX1ySX/OUA4jSakHekNP\r\n"
+            + "5eWPawIDAQABAkBbr9pUPTmpuxkcy9m5LYBrkWk02PQEOV/fyE62SEPPP+GRhv4Q\r\n"
+            + "Fgsu+V2GCwPQ69E3LzKHPsSNpSosIHSO4g3hAiEA54JCn41fF8GZ90b9L5dtFQB2\r\n"
+            + "/yIcGX4Xo7bCvl8DaPMCIQDLCUN8YiXppydqQ+uYkTQgvyq+47cW2wcGumRS46dd\r\n"
+            + "qQIhAKp2v5e8AMj9ROFO5B6m4SsVrIkwFICw17c0WzDRxTEBAiAYDmftk990GLcF\r\n"
+            + "0zhV4lZvztasuWRXE+p4NJtwasLIyQIgVKzknJe8VOt5a3shCMOyysoNEg+YAt02\r\n"
+            + "O98RPCU0nJg=\r\n" + "-----END PRIVATE KEY-----";
+
+    static String key22 = "MIIBOgIBAAJBALecq3BwAI4YJZwhJ+snnDFj3lF3DMqNPorV6y5ZKXCiCMqj8OeOmxk4YZW9aaV9"
+            + "ckl/zlAOI0mpB3pDT+Xlj2sCAwEAAQJAW6/aVD05qbsZHMvZuS2Aa5FpNNj0BDlf38hOtkhDzz/h"
+            + "kYb+EBYLLvldhgsD0OvRNy8yhz7EjaUqLCB0juIN4QIhAOeCQp+NXxfBmfdG/S+XbRUAdv8iHBl+"
+            + "F6O2wr5fA2jzAiEAywlDfGIl6acnakPrmJE0IL8qvuO3FtsHBrpkUuOnXakCIQCqdr+XvADI/UTh"
+            + "TuQepuErFayJMBSAsNe3NFsw0cUxAQIgGA5n7ZPfdBi3BdM4VeJWb87WrLlkVxPqeDSbcGrCyMkC"
+            + "IFSs5JyXvFTreWt7IQjDssrKDRIPmALdNjvfETwlNJyY";
+
+    static String key33 = "MIIBVAIBADANBgkqhkiG9w0BAQEFAASCAT4wggE6AgEAAkEAt5yrcHAAjhglnCEn"
+            + "6yecMWPeUXcMyo0+itXrLlkpcKIIyqPw546bGThhlb1ppX1ySX/OUA4jSakHekNP"
+            + "5eWPawIDAQABAkBbr9pUPTmpuxkcy9m5LYBrkWk02PQEOV/fyE62SEPPP+GRhv4Q"
+            + "Fgsu+V2GCwPQ69E3LzKHPsSNpSosIHSO4g3hAiEA54JCn41fF8GZ90b9L5dtFQB2"
+            + "/yIcGX4Xo7bCvl8DaPMCIQDLCUN8YiXppydqQ+uYkTQgvyq+47cW2wcGumRS46dd"
+            + "qQIhAKp2v5e8AMj9ROFO5B6m4SsVrIkwFICw17c0WzDRxTEBAiAYDmftk990GLcF"
+            + "0zhV4lZvztasuWRXE+p4NJtwasLIyQIgVKzknJe8VOt5a3shCMOyysoNEg+YAt02"
+            + "O98RPCU0nJg=";
+	
+	public static String Sign(String content){
+	    return rsasign.Sign(content.getBytes(), key22);
+	}
+	
+	public static String Sign2(String content){
+        return rsasign.Sign2(content.getBytes(), key33);
+    }
+	
+	//传入秘钥为ASN格式
+    //私钥签名程序,privateKey是私钥base64编码字符串,即私钥文件数据中,中间的主体部分
+    public static String Sign(byte[] content, String privateKey) {
+	try {
+		byte[] keybyte = Base64.decode(privateKey.toString());
+		ASN1InputStream in = new ASN1InputStream(keybyte);
+		ASN1Primitive obj = in.readObject();
+		RSAPrivateKeyStructure pStruct = RSAPrivateKeyStructure.getInstance(obj);
+		RSAPrivateKeySpec spec = new RSAPrivateKeySpec(pStruct.getModulus(), pStruct.getPrivateExponent());
+		KeyFactory keyFactory = KeyFactory.getInstance("RSA");
+		PrivateKey priKey = keyFactory.generatePrivate(spec);
+		java.security.Signature signature = java.security.Signature.getInstance("MD5WithRSA");
+		signature.initSign(priKey);
+		signature.update(content);
+		byte[] signed = signature.sign();
+		return Hex.bytesToHexString(signed);
+        }
+        catch (Exception e) {
+            e.printStackTrace();
+        }
+        return null;
+    }
+	    
+    //传入秘钥为PKCS#8私钥非加密格式
+	//私钥签名程序,privateKey是私钥base64编码字符串,即私钥文件数据中,中间的主体部分
+	public static String Sign2(byte[] content, String privateKey) {
+		try {
+			PKCS8EncodedKeySpec priPKCS8 = new PKCS8EncodedKeySpec(Base64.decode(privateKey));
+			KeyFactory keyf = KeyFactory.getInstance("RSA");
+			PrivateKey priKey = keyf.generatePrivate(priPKCS8);
+			java.security.Signature signature = java.security.Signature.getInstance("MD5WithRSA");
+			signature.initSign(priKey);
+			signature.update(content);
+			byte[] signed = signature.sign();
+			return Hex.bytesToHexString(signed);
+		} catch (Exception e) {
+			e.printStackTrace();
+		}
+		return null;
+	}
+}