Столкнулся с неприятной особенностью, что в стандартной библиотеке 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()
}
}