นักเทียบท่าดึง: การหมดเวลาจับมือ TLS


14

ฉันได้รับนี้อย่างสม่ำเสมอ (Ubuntu 16.04 LTS):

$ docker pull nginx
Using default tag: latest
Error response from daemon: Get https://registry-1.docker.io/v2/: net/http: TLS handshake timeout

อย่างไรก็ตาม curl TLS ทำงานได้ดี (นอกเหนือจากข้อผิดพลาด auth):

$ curl https://registry-1.docker.io/v2/
{"errors":[{"code":"UNAUTHORIZED","message":"authentication required","detail":null}]}

และแม้แต่โปรแกรม golang ขนาดเล็ก (เพื่อเลียนแบบนักเทียบท่า) ก็ใช้งานได้ดี:

package main
import (
    "fmt"
    "io/ioutil"
    "net/http"
)
func main() {
    resp, err := http.Get("https://registry-1.docker.io/v2/")
    if err != nil {
        panic(err)
    }
    defer resp.Body.Close()
    body, err := ioutil.ReadAll(resp.Body)
    if err != nil {
        panic(err)
    }
    fmt.Println("Got: ", string(body))
}

pcap สำหรับการร้องขอการหมดเวลานักเทียบท่า TLS:

reading from file docker-timeout.pcap, link-type LINUX_SLL (Linux cooked)
00:38:54.782452 IP my-ubuntu.52036 > registry-1.docker.io.https: Flags [S], seq 26945613, win 29200, options [mss 1460,sackOK,TS val 1609360 ecr 0,nop,wscale 7], length 0
00:38:54.878630 IP registry-1.docker.io.https > my-ubuntu.52036: Flags [S.], seq 2700732154, ack 26945614, win 26847, options [mss 1460,sackOK,TS val 947941366 ecr 1609360,nop,wscale 8], length 0
00:38:54.878691 IP my-ubuntu.52036 > registry-1.docker.io.https: Flags [.], ack 1, win 229, options [nop,nop,TS val 1609384 ecr 947941366], length 0
00:38:54.878892 IP my-ubuntu.52036 > registry-1.docker.io.https: Flags [P.], seq 1:156, ack 1, win 229, options [nop,nop,TS val 1609384 ecr 947941366], length 155
00:38:55.175931 IP my-ubuntu.52036 > registry-1.docker.io.https: Flags [P.], seq 1:156, ack 1, win 229, options [nop,nop,TS val 1609459 ecr 947941366], length 155
00:38:55.475954 IP my-ubuntu.52036 > registry-1.docker.io.https: Flags [P.], seq 1:156, ack 1, win 229, options [nop,nop,TS val 1609534 ecr 947941366], length 155
00:38:56.076327 IP my-ubuntu.52036 > registry-1.docker.io.https: Flags [P.], seq 1:156, ack 1, win 229, options [nop,nop,TS val 1609684 ecr 947941366], length 155
00:38:57.280103 IP my-ubuntu.52036 > registry-1.docker.io.https: Flags [P.], seq 1:156, ack 1, win 229, options [nop,nop,TS val 1609985 ecr 947941366], length 155
00:38:59.684095 IP my-ubuntu.52036 > registry-1.docker.io.https: Flags [P.], seq 1:156, ack 1, win 229, options [nop,nop,TS val 1610586 ecr 947941366], length 155
00:39:04.492102 IP my-ubuntu.52036 > registry-1.docker.io.https: Flags [P.], seq 1:156, ack 1, win 229, options [nop,nop,TS val 1611788 ecr 947941366], length 155
00:39:04.879468 IP my-ubuntu.52036 > registry-1.docker.io.https: Flags [F.], seq 156, ack 1, win 229, options [nop,nop,TS val 1611884 ecr 947941366], length 0
00:39:04.976015 IP registry-1.docker.io.https > my-ubuntu.52036: Flags [.], ack 1, win 105, options [nop,nop,TS val 947943890 ecr 1609384,nop,nop,sack 1 {156:157}], length 0
00:39:04.976073 IP my-ubuntu.52036 > registry-1.docker.io.https: Flags [P.], seq 1:156, ack 1, win 229, options [nop,nop,TS val 1611909 ecr 947943890], length 155
00:39:05.275922 IP my-ubuntu.52036 > registry-1.docker.io.https: Flags [P.], seq 1:156, ack 1, win 229, options [nop,nop,TS val 1611984 ecr 947943890], length 155
00:39:05.876104 IP my-ubuntu.52036 > registry-1.docker.io.https: Flags [P.], seq 1:156, ack 1, win 229, options [nop,nop,TS val 1612134 ecr 947943890], length 155

มีอะไรผิดปกติหรือเปล่า?


1
ฉันสลับโมเด็ม dsl ของฉันและปัญหาได้หายไป ... ฉันสงสัยว่ามันเป็นปัญหา mtu
วิลเล็ม

คำตอบ:


14

net/http: TLS handshake timeoutหมายความว่าคุณมีการเชื่อมต่ออินเทอร์เน็ตที่ช้า ค่าเริ่มต้นของการหมดเวลาการเชื่อมต่อมีขนาดเล็กเกินไปสำหรับสภาพแวดล้อมของคุณ น่าเสียดายที่นักเทียบท่าไม่มีการตั้งค่าใด ๆ ที่อนุญาตให้คุณเปลี่ยนการหมดเวลาเชื่อมต่อ คุณอาจลองสร้างแคชรีจิสตรีของคุณเองที่อื่นและดึงภาพจากมัน


1
ดีspeedtest.netและfast.comแสดงความเร็วอินเทอร์เน็ตของฉันคือ 90 Mbit / s มันช้าไหม ฉันกำลังดึงpython:2.7-slimภาพ ฉันสามารถดึงhello-worldจากฮับได้ แต่ไม่ใช่งูหลาม มันทำให้ฉันมีTLS handshake timeoutข้อผิดพลาดเดียวกัน
Nikhil Chilwant

3
ก่อนที่ผู้คนจะเริ่มทำสิ่งที่น่าทึ่งฉันต้องการพูดว่า: การพิมพ์ผิดในชื่อภาพก็ทำให้เกิดข้อผิดพลาดเหมือนกัน อธิบายได้ดีมาก
Barafu Albino

1
การหมดเวลาจับมือ TLS ส่วนใหญ่ไม่ได้หมายความว่าการเชื่อมต่ออินเทอร์เน็ตจะช้า ข้อความนี้จะปรากฏขึ้นหากการจับมือ TLS หยุดทำงานด้วยเหตุผลที่แตกต่างกัน ตัวอย่างเช่นหากด้านใดด้านหนึ่งไม่ชอบพูดคุยกับรุ่น TLS เฉพาะหรือเนื่องจากปัญหาใบรับรอง
Bndr

4

ในกรณีของฉันเซิร์ฟเวอร์ของฉันอยู่หลัง nat และพร็อกซีและตั้งค่าให้ตรวจหาพร็อกซีอัตโนมัติสิ่งที่ฉันทำบนเทอร์มินัลปัจจุบันฉันมีการตั้งค่าพร็อกซีส่งออก

root@k8master:~/runner# export http_proxy="http://192.168.10.208:3128"
root@k8master:~/runner# docker pull gitlab/gitlab-runner:latest
latest: Pulling from gitlab/gitlab-runner
7b722c1070cd: Pull complete 
5fbf74db61f1: Pull complete 
ed41cb72e5c9: Pull complete 
7ea47a67709e: Pull complete 
ae336ceeca88: Pull complete 
f9f79780e6cf: Pull complete 
67e622273f37: Pull complete 
bc84c40af701: Pull complete 
69e36092e9de: Pull complete 
Digest: sha256:b1f5387942aaaf8c220f6613a1e96ba2cbcb6c58a5e47ca0df8ae3216720a15e
Status: Downloaded newer image for gitlab/gitlab-runner:latest

3

ฉันมีปัญหาเท่ากันโดยใช้docker run hello-worldครั้งที่ 1 ซึ่งส่งผลให้การดาวน์โหลดภาพโดยใช้https://registry-1.docker.io/v2/ซึ่งจบลงด้วย

docker: Error response from daemon: Get https://registry-1.docker.io/v2/: proxyconnect tcp: net/http: TLS handshake timeout.

ค้นหาเว็บเป็นเวลาหลายชั่วโมงและพบว่าสิ่งนี้เกิดขึ้นกับผู้ใช้บางคนที่มี ubuntu 18.04 และปล่อยตัวนักเทียบท่าปัจจุบันหลังพร็อกซี วิธีแก้ปัญหาคือการลบการกำหนดค่า https-proxy ทั้งหมดออกจากการตั้งค่า http-proxy เพื่อบังคับให้ดาวน์โหลด http (ไม่ใช่ https)

ไม่รู้จริงเหตุผลอะไร

(โดยวิธีการ: ฉันมีปัญหา "TLS handshake" เท่ากันกับผู้แต่งและผู้บรรจุเนื่องจากนี่เป็นไฟล์ cacert.pem ที่ขาดหายไปซึ่งไม่ได้จัดทำโดย ubuntu ตามค่าเริ่มต้นบางทีนักเทียบท่าปัญหาอาจจะไปในทิศทางเดียวกัน ?)


3

ฉันพบปัญหาเดียวกัน จากนั้นคำตอบของ Azamat Hackimov ก็ชี้ให้ฉันไปในทิศทางที่ถูกต้อง เครื่องของฉันค่อนข้างช้าโดยเฉพาะเวลาบู๊ตเมื่อฉันต้องการเปิดใช้บริการ ดังนั้นการหมดเวลาอันสั้นจะเริ่มและฆ่าคำขอของฉัน

นี่เป็นวิธีแก้ปัญหาของฉัน:

docker pull $IMAGE || docker pull $IMAGE ||  docker pull $IMAGE || docker pull $IMAGE

เพียงแค่ค้อนเซิร์ฟเวอร์ด้วยการร้องขอ โดยปกติคนที่สองจะประสบความสำเร็จสำหรับฉัน


ไม่ใช่วิธีการแก้ปัญหาที่ชัดเจน แต่เป็นการแก้ปัญหาชั่วคราวที่ดี
กอนซาโล่เฉา

2

หากคุณกำลังใช้รีจีสทรีส่วนตัวคุณต้องวางใบรับรองสำหรับภายใต้ /etc/docker/certs.d/ registryname /ca.crt

ชื่อรีจิสทรีจะเปลี่ยนตาม

นอกจากนี้โปรดเปลี่ยนขนาดMTUของคุณเป็น 1300 นี่เป็นสิ่งหนึ่งที่ฉันทำเพื่อแก้ไขข้อผิดพลาด Registry หนึ่งฉันเชื่อว่าคุณอาจได้ทำไปแล้ว คำสั่งสำหรับการเปลี่ยนแปลง MTU

ip link set dev eth0 mtu 1300

ขนาด MTU เป็นสิ่งสำคัญในการตรวจสอบเพื่อหลีกเลี่ยงข้อผิดพลาดนี้หากความเร็วอินเทอร์เน็ตของคุณดีจริงๆ


นั่นคือเคล็ดลับที่ดี แต่ไม่ได้มีใบรับรองจะส่งผลให้เกิดข้อผิดพลาดไม่ได้x509: certificate signed by unknown authority TLS handshake timeout
wisbucky

0

สิ่งที่ใช้ได้ผลสำหรับฉันคือใช้อินเทอร์เฟซเครือข่ายอื่น แทนที่จะเชื่อมต่อผ่านอีเธอร์เน็ต (ใช้สาย) ฉันเปลี่ยนเป็น wifi แก้ไขปัญหา.

ฉันอยู่ในการติดตั้ง Raspbian Stretch ที่สดใหม่โดยวิธีการ


0

คำตอบข้างต้นไม่สามารถแก้ปัญหาของฉันได้ แต่ฉันพบว่าhttps://github.com/helm/helm/issues/5220ด้านล่างใช้งานได้สำหรับฉัน!

หลังจากนั้นการเปลี่ยนแปลงแผนกไอทีของ บริษัท ของฉันได้พบวิธีแก้ปัญหา ฉันใช้ตัวแปรสภาพแวดล้อม https_proxy กับ https: // url กับพร็อกซีของเรา สิ่งนี้ใช้ได้กับเครื่องมือส่วนใหญ่ที่เราใช้ แต่ไม่ใช่สำหรับหางเสือหรือ kube ที่ใหม่กว่า พวกเขาดูเหมือนจะมีปัญหาบางอย่างกับการจับมือ TLS เราเปลี่ยนจาก https: // เป็น http: // url (เช่น https_proxy = http: // myproxy ) และตอนนี้ทุกอย่างทำงานได้ดี


0

คุณสามารถได้รับTLS handshake timeoutข้อผิดพลาดหากพร็อกซี daemon ของคุณไม่ได้กำหนดค่าอย่างถูกต้อง

# verify docker daemon proxy configuration
/etc/systemd/system/docker.service.d/proxy.conf

# flush changes
sudo systemctl daemon-reload

# restart docker service
sudo systemctl restart docker 

สำหรับรายละเอียดเพิ่มเติมดูhttps://docs.docker.com/config/daemon/systemd/#httphttps-proxy

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.