AterCattus
@AterCattus
Люблю быстрый backend

Golang, HTTPS запросы к серверам MS (SSL renegotiation). Есть ли у кого успешный опыт?

Столкнулся с неприятной особенностью, что в стандартной библиотеке go несколько обошли стороной поддержку ssl renegotiation. Некий патч в итоге идет в поставке, но толку мало.
Запросы на https://s.notify.live.net/*** успешно удается отослать средствами php curl (CAINFO, SSLCERT и SSLKEY в порядке), но ни в какую пока не выходит через go. Перепробовал гору всяких решений, форков http/tls, всяких http2, go-curl и т.п... В лучшем случае вместо "local error: no renegotiation" получаю 413 ошибку.
Пробовал go 1.3 и 1.4.

Заранее спасибо за любой дельный совет.

P.S. Рабочий вариант через github.com/andelf/go-curl (может кому пригодится):
(go1.4.2 linux/amd64; libcurl/7.32.0 OpenSSL/1.0.1e zlib/1.2.8 libidn/1.28 librtmp/2.3)
package main

import (
    curl "github.com/andelf/go-curl"
)

func main() {
    url  := `https://s.notify.live.net...`
    body := `<?xml version="1.0" encoding="utf-8"?>...`

    easy := curl.EasyInit()
    defer easy.Cleanup()
    if easy != nil {
        easy.Setopt(curl.OPT_URL, url)
        easy.Setopt(curl.OPT_POST, true)
        easy.Setopt(curl.OPT_VERBOSE, true)

        easy.Setopt(curl.OPT_SSLCERT, `cert/ssl.crt`)
        easy.Setopt(curl.OPT_SSLKEY,  `cert/ssl.key`)
        easy.Setopt(curl.OPT_CAINFO,  `cert/gd_bundle-g2-g1.crt`)
        easy.Setopt(curl.OPT_SSL_VERIFYHOST, 2)
        easy.Setopt(curl.OPT_SSL_VERIFYPEER, 1)
        easy.Setopt(curl.OPT_HTTPHEADER, []string{
            "Content-Type: text/xml",
            "X-NotificationClass: 2",
            "X-WindowsPhone-Target: toast",
        })

        easy.Setopt(curl.OPT_POSTFIELDS, body)
        easy.Perform()
    }
}
  • Вопрос задан
  • 907 просмотров
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы