Bitbucket đổi SSH sang ssh.bitbucket.org: brownout từ 12/11
DevOps

Bitbucket đổi SSH sang ssh.bitbucket.org: brownout từ 12/11

Từ 12/11/2026, SSH tới bitbucket.org bị chặn dần theo khung giờ, gỡ hẳn ngày 10/12. Cách chuyển sang ssh.bitbucket.org trên máy, server, CI và sửa lỗi Permission denied.

Bitbucket Cloud đang chuyển toàn bộ Git qua SSH sang host mới ssh.bitbucket.org. Tên bitbucket.org vẫn còn, nhưng chỉ phục vụ HTTPS: trang web và API. Từ 12/11/2026, SSH tới bitbucket.org bắt đầu bị chặn theo từng khung giờ, mỗi lần một lâu hơn, và ngày 10/12/2026 bị gỡ hẳn.

Nghĩa là từ 12/11, máy nào chưa chuyển sẽ gặp git pull hay deploy lúc được lúc không. Đây là kiểu lỗi khó đoán nhất, vì trông y như mạng chập chờn.

Bài này đi lần lượt: lịch chặn theo giờ Việt Nam, kiểm tra trong 1 phút, sửa trên máy cá nhân, sửa trên server và CI, rồi tra lỗi Permission denied (publickey). Đây là lỗi hay gặp nhất sau khi chuyển.

Mọi lệnh trong bài chạy được trên macOS, Linux và Windows. Trên Windows, mở Git Bash để chạy.

Lịch brownout: SSH trên bitbucket.org tắt dần tới 10/12/2026

Ban đầu Atlassian định tắt SSH trên bitbucket.org ngày 12/11/2026. Bản cập nhật ngày 21/10/2026 đổi lại: 12/11 là ngày bắt đầu brownout, tức các đợt chặn có kiểm soát để mọi người kịp phát hiện chỗ còn sót. Trong mỗi đợt, SSH tới bitbucket.org bị chặn tạm thời và trả về thông báo lỗi.

Lịch brownout SSH trên bitbucket.org từ 12/11 đến 10/12/2026: mỗi đợt kéo dài dần từ 15 phút lên 3 giờ, ngày 10/12 gỡ hẳn

Ngày (2026) Mỗi đợt chặn kéo dài
12–13/11 15 phút
16–20/11 30 phút
23–24/11 1 giờ
30/11–2/12 2 giờ
3–4/12 và 7–9/12 3 giờ
10/12 Gỡ hẳn

Mỗi ngày có 4 đợt, bắt đầu lúc 00:00, 06:00, 12:00 và 18:00 UTC. Theo giờ Việt Nam là 07:00, 13:00, 19:00 và 01:00 sáng hôm sau. Cuối tuần và các ngày 25–27/11 không có đợt chặn nào, nhưng đợt 01:00 của tối thứ Sáu vẫn rơi vào rạng sáng thứ Bảy.

Nếu bạn có job deploy chạy lúc 13:00 hay cron đồng bộ code lúc 07:00, thì đó chính là những thứ sẽ lỗi đầu tiên.

Ai phải chuyển sang ssh.bitbucket.org, ai không

Bạn bị ảnh hưởng nếu clone, pull, fetch hoặc push với Bitbucket Cloud qua SSH. Cách sửa chỉ là đổi phần host; workspace, tên repo và key giữ nguyên:

git@bitbucket.org:<workspace>/<repo>.git
→ git@ssh.bitbucket.org:<workspace>/<repo>.git

ssh://git@bitbucket.org/<workspace>/<repo>.git
→ ssh://git@ssh.bitbucket.org/<workspace>/<repo>.git

Remote bắt đầu bằng https:// thì không bị ảnh hưởng. Việc Bitbucket gỡ App Password là chuyện khác, dành cho người dùng HTTPS; nếu bạn đang kẹt ở đó, xem bài chuyển sang API token.

Đừng quên những máy không ai ngồi trước màn hình: server deploy, cron job, script deploy, runner CI. Chỗ nào còn gọi bitbucket.org qua SSH sẽ lỗi trong mọi đợt brownout, rồi lỗi hẳn từ 10/12.

Kiểm tra trong 1 phút

Hai lệnh dưới đây chỉ đọc, không sửa gì.

Lệnh 1: repo nào còn trỏ thẳng bitbucket.org. Đổi ~/Projects thành thư mục chứa code của bạn:

find ~/Projects -type d -name .git -prune 2>/dev/null | while read -r g; do d=${g%/.git}; git -C "$d" remote -v | grep -v "https://" | grep -qE "@bitbucket\.org[:/]" && echo "$d"; done

Mỗi dòng in ra là một repo cần đổi remote. Remote HTTPS được bỏ qua. Remote dùng alias (ví dụ git@bitbucket-work:...) cũng không hiện ở đây; lệnh 2 lo phần đó.

Lệnh 2: alias nào trong ~/.ssh/config còn trỏ bitbucket.org:

grep -iE '^\s*hostname\s+bitbucket\.org\s*$' -B3 ~/.ssh/config

Lệnh in ra dòng HostName bitbucket.org cùng 3 dòng phía trên, để bạn thấy nó thuộc khối Host nào.

Bạn thuộc kiểu nào?

Bạn thấy gì Kiểu Việc cần làm
Lệnh 1 in ra repo; không có ~/.ssh/config, hoặc config không nhắc tới Bitbucket 1 Đổi remote từng repo
Lệnh 2 in ra một alias, ví dụ Host bitbucket-work 2 Sửa HostName, không đổi repo nào
Config có khối Host bitbucket.org với IdentityFile riêng 3 Sửa khối Host theo mẫu bên dưới

Một máy có thể dính nhiều kiểu cùng lúc; sửa lần lượt từng kiểu. Lưu ý: khối Host bitbucket.org không có dòng HostName thì lệnh 2 không bắt được, nên hãy mở ~/.ssh/config tìm dòng Host bitbucket.org cho chắc.

Sửa trên máy cá nhân

Bước 1: thêm host key cho ssh.bitbucket.org

SSH cần host key của ssh.bitbucket.org trong ~/.ssh/known_hosts. Thiếu thì Git dừng với lỗi Host key verification failed, hoặc hỏi xác nhận, điều mà cron và script không trả lời được.

ssh.bitbucket.org dùng chung 3 host key với bitbucket.org. Lệnh đầu lấy key chính thức từ bitbucket.org/site/ssh, đổi tên host rồi ghi thêm vào known_hosts (đã có thì bỏ qua). Lệnh thứ hai in fingerprint để bạn đối chiếu:

ssh-keygen -F ssh.bitbucket.org >/dev/null || curl -fsS https://bitbucket.org/site/ssh | sed 's/^bitbucket\.org /ssh.bitbucket.org /' >> ~/.ssh/known_hosts
ssh-keygen -l -F ssh.bitbucket.org

So với 3 fingerprint dưới đây (đối chiếu trên bitbucket.org/site/ssh và thông báo của Atlassian ngày 23/10/2026):

ED25519  SHA256:ybgmFkzwOSotHTHLJgHO0QN8L0xErw6vd0VhFA9m3SM
ECDSA    SHA256:FC73VB6C4OQLSCrjEayhMp9UMxS97caD/Yyi2bhW/J0
RSA      SHA256:46OSHA1Rmj8E8ERTC6xkNcmGOw9oFxYr0WF6zWW8l1E

Khớp cả 3 thì sang bước tiếp. Không khớp thì đừng kết nối; mở https://bitbucket.org/site/ssh trên trình duyệt và đối chiếu lại.

Bước 2: sao lưu config

Trước khi sửa ~/.ssh/config, giữ một bản sao (kiểu 1 không có file config thì bỏ qua):

cp ~/.ssh/config ~/.ssh/config.bak

Bước 3: sửa theo kiểu của bạn

Kiểu 1: không có config, remote ghi thẳng git@bitbucket.org

Vào từng repo mà lệnh 1 liệt kê, đổi remote rồi xem lại:

git remote set-url origin git@ssh.bitbucket.org:<workspace>/<repo>.git
git remote -v

git remote -v phải hiện ssh.bitbucket.org. Repo có remote khác trỏ tới Bitbucket (ví dụ upstream) thì thay origin bằng tên remote đó và đổi luôn.

Kiểu 2: dùng alias

Remote của bạn có dạng git@bitbucket-work:<workspace>/<repo>.git. Trong khối alias, chỉ đổi HostName bitbucket.org thành HostName ssh.bitbucket.org:

Host bitbucket-work
  HostName ssh.bitbucket.org
  User git
  IdentityFile ~/.ssh/bitbucket_work
  IdentitiesOnly yes

Vậy là xong. Không phải đổi repo nào, vì remote chỉ gọi tên alias, còn host thật nằm ở HostName. Có nhiều alias (mỗi tài khoản một alias) thì sửa từng cái.

Kiểu 3: khối Host bitbucket.org có IdentityFile riêng

Đây là cách bài hướng dẫn SSH key trước đây của blog chỉ, nên nhiều bạn đang ở kiểu này:

Host bitbucket.org
  HostName bitbucket.org
  User git
  IdentityFile ~/.ssh/bitbucket_work
  IdentitiesOnly yes

Cái bẫy nằm ở dòng Host. Khối này chỉ áp dụng khi bạn kết nối tới đúng tên bitbucket.org. Nếu bạn chỉ đổi remote sang git@ssh.bitbucket.org:, SSH sẽ không dùng key ~/.ssh/bitbucket_work nữa, và Bitbucket từ chối với lỗi Permission denied (publickey).

Khối Host bitbucket.org chỉ khớp tên cũ: remote mới ssh.bitbucket.org không được gửi key nên bị Permission denied; sửa dòng Host để khớp cả hai tên

Sửa khối đó thành:

Host bitbucket.org ssh.bitbucket.org
  HostName ssh.bitbucket.org
  User git
  IdentityFile ~/.ssh/bitbucket_work
  IdentitiesOnly yes

Dòng Host giờ khớp cả hai tên, còn HostName luôn đưa kết nối tới host mới. Sau khi sửa, cả remote cũ (git@bitbucket.org:) lẫn mới (git@ssh.bitbucket.org:) đều chạy và không bị brownout, vì kết nối thật luôn đi tới ssh.bitbucket.org. Đổi remote như kiểu 1 lúc nào tiện cũng được. Key của bạn tên khác thì giữ nguyên đường dẫn đang dùng.

Bước 4: xem SSH sẽ dùng key nào

ssh -G ssh.bitbucket.org | grep -i '^identityfile'

Với kiểu 3, kết quả phải có key bitbucket_work. Với kiểu 2, hỏi theo tên alias:

ssh -G bitbucket-work | grep -i '^identityfile'

Key trong kết quả phải là key bạn đã thêm lên Bitbucket.

Bước 5: thử đăng nhập

ssh -T git@ssh.bitbucket.org

Nếu dùng alias, thử bằng tên alias:

ssh -T git@bitbucket-work

Thành công khi bạn thấy dòng có authenticated via ssh key., kèm một câu báo shell access bị tắt. Câu đó là bình thường, không phải lỗi.

Nếu key có passphrase, nạp key vào ssh-agent. Git trong terminal vẫn hỏi passphrase như thường, nhưng script, IDE và cron thì không hỏi, nên sẽ báo Permission denied.

Trên macOS:

ssh-add --apple-use-keychain ~/.ssh/bitbucket_work

Trên Windows (Git Bash) và Linux:

ssh-add ~/.ssh/bitbucket_work

Server deploy và CI

Kiểm tra từng user

Đây là chỗ dễ sót nhất. Trên server, mỗi user chạy git có ~/.ssh riêng: sửa xong cho deploy không có nghĩa là root hay www-data đã ổn. Hãy liệt kê mọi user có chạy git (user deploy, user chạy cron, user web server nếu nó gọi git) và kiểm tra từng người.

Script dưới đây chỉ đọc, không sửa gì. Nó xem host key, remote, alias, thử đăng nhập thật tới ssh.bitbucket.org, liệt kê script hay crontab còn ghi cứng git@bitbucket.org, rồi kết luận SẴN SÀNG hoặc CHƯA kèm số mục cần sửa.

curl -fsSLO https://raw.githubusercontent.com/atdevblog/docker-dev-manager/main/public/tools/bitbucket-ssh-check.sh
bash bitbucket-ssh-check.sh

Để chạy bằng user khác mà không phải đăng nhập lại, tải script vào /tmp rồi dùng sudo -u:

cd /tmp && curl -fsSLO https://raw.githubusercontent.com/atdevblog/docker-dev-manager/main/public/tools/bitbucket-ssh-check.sh
sudo -u deploy -H bash /tmp/bitbucket-ssh-check.sh

Lặp lại dòng thứ hai, thay deploy bằng www-data, root và các user khác có chạy git.

User nào báo CHƯA thì chuyển sang user đó và sửa như phần máy cá nhân: host key trước, rồi kiểu 1, 2 hoặc 3.

sudo -iu deploy

Crontab và script deploy

Cron và script deploy chạy khi không ai ngồi trước terminal: không ai gõ passphrase, không ai trả lời câu hỏi host key. Vì vậy:

  • Lệnh clone/pull ghi cứng git@bitbucket.org: → sửa thành git@ssh.bitbucket.org:.
  • Thêm host key bằng đúng user chạy cron ngay bây giờ, đừng đợi tới khi job đầu tiên lỗi trong một đợt brownout.
  • Key deploy có passphrase → xem dòng passphrase trong bảng xử lý lỗi.

Xem crontab của một user có nhắc tới bitbucket.org không:

sudo crontab -u deploy -l | grep -n 'bitbucket\.org'

Bitbucket Pipelines

Bước nào trong pipeline chạy Git qua SSH tới Bitbucket (clone repo khác, push tag…) cũng phải đổi URL sang ssh.bitbucket.org.

Lỗi known_hosts mặc định của Pipelines chưa có ssh.bitbucket.org (BCLOUD-24132) đã được Atlassian đóng với trạng thái Fixed (kiểm tra ngày 23/10/2026). Nếu sau khi đổi URL, bước đó vẫn dừng ở Host key verification failed, thêm host key ngay trong script của bước bằng lệnh Atlassian đưa trong thông báo:

curl -s https://bitbucket.org/site/ssh | sed 's/bitbucket.org/ssh.bitbucket.org/' >> ~/.ssh/known_hosts

Bamboo

Lỗi Bamboo không dùng URL SSH mới (BAM-26573) đã được sửa ở các bản 13.0.1, 12.1.12 và 10.2.24. Bamboo của bạn lấy code từ Bitbucket Cloud qua SSH thì nâng lên một trong các bản đó, hoặc bản mới hơn cùng dòng, rồi chạy thử một build trước 12/11/2026.

Deploy key

Deploy key vẫn là key SSH, nên sửa y như máy cá nhân: key khai báo dưới Host bitbucket.org → kiểu 3; mỗi repo một key qua alias → kiểu 2. Sau đó, bằng đúng user deploy, vào thư mục repo và chạy thử:

git fetch

Tường lửa

Công ty bạn chặn SSH đi ra ngoài theo tên host thì thêm ssh.bitbucket.org cổng 22 vào danh sách cho phép, và sửa các quy tắc đang ghi bitbucket.org cho SSH. Đây là hướng dẫn trong chính thông báo của Atlassian.

Mạng chặn hẳn cổng 22 thì Atlassian có hướng dẫn riêng dùng host và cổng thay thế. Tới ngày 23/10/2026, thông báo chưa nói host thay thế đó có bị ảnh hưởng bởi đợt đổi này hay không, nên nếu bạn đang dùng cách này, hãy theo dõi thông báo của Atlassian.

Sửa lỗi Permission denied (publickey) và các lỗi khác

Triệu chứng Nguyên nhân Cách sửa
Từ 12/11/2026, Git qua SSH lúc được lúc không Máy vẫn gọi bitbucket.org và đang rơi vào một đợt brownout Chuyển sang ssh.bitbucket.org theo bài này
Host key verification failed Thiếu host key của ssh.bitbucket.org Làm lại bước 1: thêm host key, so fingerprint
Permission denied (publickey) ngay sau khi đổi remote Key nằm dưới khối Host bitbucket.org Sửa theo kiểu 3
Permission denied, key có passphrase Key chưa nạp vào ssh-agent. Git trong terminal vẫn hỏi passphrase, nhưng script, IDE và cron thì không Nạp key bằng ssh-add (lệnh ở bước 5)
Permission denied, key chưa có trên Bitbucket hoặc đang gắn với tài khoản khác Bitbucket không nhận key này cho tài khoản của bạn Thêm file .pub ở Personal Bitbucket settings → SSH keys. Một key không thêm được vào hai tài khoản: tạo key riêng cho từng tài khoản và dùng alias (kiểu 2)
Không có file key Chưa tạo key Tạo key (lệnh bên dưới), rồi thêm file .pub lên Bitbucket
Connection timed out, không kết nối được Lỗi DNS, hoặc tường lửa chặn ssh.bitbucket.org cổng 22 Xem mục tường lửa ở trên
Đăng nhập được nhưng push bị từ chối Tài khoản thiếu quyền trên repo, hoặc branch đang được bảo vệ Nhờ admin workspace cấp quyền, hoặc xem lại quy tắc bảo vệ branch

Tạo key mới:

ssh-keygen -t ed25519 -f ~/.ssh/bitbucket_work

Khi không rõ vì sao bị từ chối, bật chế độ debug:

ssh -vT git@ssh.bitbucket.org

Tìm các dòng Offering public key: đó là những key SSH thật sự gửi cho Bitbucket. Key đúng không nằm trong số đó thì quay lại bước 4, xem lại IdentityFile.

Kiểm tra tự động

Không muốn chạy từng lệnh? Docker Dev Manager là app mã nguồn mở mình viết, chạy ngay trên máy của bạn: https://github.com/atdevblog/docker-dev-manager. Trang Bitbucket SSH của app có:

  • Một nút kiểm tra host key, mọi repo và alias trong ~/.ssh/config, đăng nhập thật bằng từng key, và tìm script/crontab còn ghi cứng git@bitbucket.org.
  • Sửa host key, alias và remote sau khi cho bạn xem trước thay đổi, và luôn sao lưu file trước khi sửa.

Việc thêm key lên Bitbucket vẫn do bạn tự làm.

Checklist trước 12/11/2026

  • Chạy lệnh 1 và lệnh 2 trên mọi máy cá nhân.
  • Thêm host key ssh.bitbucket.org, fingerprint khớp 3 dòng trong bài.
  • Sao lưu ~/.ssh/config, rồi sửa theo kiểu 1, 2 hoặc 3.
  • ssh -T git@ssh.bitbucket.org in ra authenticated via ssh key.
  • Key có passphrase đã nạp bằng ssh-add.
  • Server: chạy script bằng từng user có chạy git (deploy, www-data, root…), tất cả báo SẴN SÀNG.
  • Crontab và script deploy không còn git@bitbucket.org.
  • Pipelines và Bamboo: đã đổi URL và chạy thử một lần.
  • Deploy key: đã git fetch thử bằng đúng user deploy.
  • Tường lửa (nếu có): đã cho phép ssh.bitbucket.org cổng 22.

Xong checklist trước 12/11 thì các đợt brownout sẽ không đụng tới bạn. Muốn ôn lại thao tác Git trước khi sửa remote trên server thật, bạn có thể tập trên Git Playground.

Nguồn

Bài liên quan trên atdev.blog:

Tài liệu tham khảo (kiểm tra ngày 23/10/2026):

Câu hỏi thường gặp

Remote HTTPS có bị ảnh hưởng không?▾
Không. Đợt thay đổi này chỉ áp dụng cho Git qua SSH. bitbucket.org vẫn phục vụ trang web, API và Git qua HTTPS như cũ.
Host key của ssh.bitbucket.org có khác bitbucket.org không?▾
Không. Atlassian dùng chung 3 host key cho cả hai tên. Bạn chỉ cần thêm chúng vào known_hosts dưới tên ssh.bitbucket.org và đối chiếu fingerprint với trang bitbucket.org/site/ssh.
Chưa chuyển trước 12/11/2026 thì chuyện gì xảy ra?▾
Từ 12/11 đến 9/12/2026, vào các ngày làm việc Bitbucket chặn SSH trên bitbucket.org theo từng khung giờ, mỗi lần từ 15 phút đến 3 giờ. Git chỉ lỗi trong các khung đó nên rất dễ tưởng là mạng chập chờn. Ngày 10/12/2026 bitbucket.org ngừng hẳn SSH.
Đã đổi remote mà vẫn bị Permission denied (publickey)?▾
Thường là vì key của bạn khai báo dưới khối Host bitbucket.org trong ~/.ssh/config. Khối đó không áp dụng cho tên ssh.bitbucket.org nên SSH không gửi key. Sửa dòng Host để khớp cả hai tên, như kiểu 3 trong bài.
Bitbucket Pipelines có cần sửa gì không?▾
Chỉ những bước chạy Git qua SSH tới Bitbucket, như clone repo khác hay push tag. Atlassian đã đánh dấu đã sửa lỗi thiếu host key ssh.bitbucket.org trong Pipelines; nếu bước đó vẫn báo Host key verification failed, thêm host key ngay trong script của bước.

Công cụ liên quan

Bài viết hữu ích?