Java - 创建Github v3公钥

时间:2012-03-20 01:54:13

标签: java ssh github

我无法想出这个。我正在尝试动态滚动键。我可以很好地创建POST请求,但是当我调用IOException时,会收到400错误和带有post的堆栈跟踪。以下是一个独立的示例。我正在使用JSCH生成密钥。 API文档:http://developer.github.com/v3/users/keys/

API调用:POST /user/keys

public static class LiberalHostnameVerifier implements HostnameVerifier {
    public boolean verify(String hostname, SSLSession session) {
        return true;
    }
}

public static String post(String requestUrl, Map<String, String> params,
    String username, String password) throws Exception {
    String data = "";
    int paramCount = 1;
    for (Entry<String, String> param : params.entrySet()) {
        if (paramCount == 1) {
            data = URLEncoder.encode(param.getKey(), "UTF-8") + "="
                + URLEncoder.encode(param.getValue(), "UTF-8");
        } else {
            data += "&" + URLEncoder.encode(param.getKey(), "UTF-8") + "="
                + URLEncoder.encode(param.getValue(), "UTF-8");
        }
        paramCount++;
    }
    URL url = new URL(requestUrl);
    HttpsURLConnection conn = (HttpsURLConnection) (url).openConnection();
    conn.setDoOutput(true);
    conn.setRequestMethod("POST");
    conn.setHostnameVerifier(new LiberalHostnameVerifier());
    BASE64Encoder enc = new BASE64Encoder();
    String userAuth = username + ":" + password;
    String encodedAuthorization = enc.encode(userAuth.getBytes());
    conn.setRequestProperty("Authorization", "Basic " + encodedAuthorization);
    OutputStreamWriter wr = new OutputStreamWriter(conn.getOutputStream());
    wr.write(data);
    wr.flush();
    BufferedReader rd = new BufferedReader(new InputStreamReader(
        conn.getInputStream()));
    String line;
    String response = "";
    while ((line = rd.readLine()) != null) {
        response += line;
    }
    wr.close();
    rd.close();
    return response;
}

public static KeyPair generateKey(String filename) throws Exception {
    JSch jsch = new JSch();
    try {
        KeyPair kpair = KeyPair.genKeyPair(jsch, KeyPair.RSA);
        kpair.setPassphrase("");
        kpair.writePrivateKey(filename + ".pem");
        kpair.writePublicKey(filename + ".pub", "Auto-generated.");
        System.out.println("Finger print: " + kpair.getFingerPrint());
        // kpair.dispose();
        return kpair;
    } catch (Exception e) {
        System.out.println(e);
    }
    return null;
}

public static String getFileContents(File file) throws Exception {
    byte[] buffer = new byte[(int) file.length()];
    FileInputStream f = new FileInputStream(file);
    f.read(buffer);
    return new String(buffer);
}

public static String createKey(String title) throws Exception {
    generateKey(title);
    final String key = getFileContents(new File(
            "/Users/franklovecchio/Desktop/development/" + title
                + ".pub"));
    System.out.println("key: " + key);
    Map<String, String> params = new HashMap<String, String>() {

        {
            put("title", title);
            put("key", key);
        }
    };
    return post("https://api.github.com/user/keys", params, "username",
        "password");
}

//调用createKey(“key);

2 个答案:

答案 0 :(得分:1)

感谢@nico_ekito和@ J-16 SDiZ为正确的方向提供帮助。如果仔细查看文档,请求不会使用标准POST参数,而是将JSON作为原始输入,并且不能对ssh-rsa键进行编码。接下来,即使使用disableHtmlEscaping,我也无法让GSON对字符串进行编码。所以,我不得不假装它:

String json = "{\"title\":\"" + title + "\",\"key\":\"" + key.trim() + "\"}";

答案 1 :(得分:0)

您是否尝试过ssh库(例如JSch)。他们可以在SSH consumable format生成RSA密钥。