
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.

| 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).

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ànhgit@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ứnggit@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.orgin raauthenticated 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 fetchthử bằng đúng user deploy. - Tường lửa (nếu có): đã cho phép
ssh.bitbucket.orgcổ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:
- Cài SSH key cho Bitbucket: bài cũ dùng
bitbucket.org, bài này cập nhật cho host mới. - Dùng API token cho Git qua HTTPS
Tài liệu tham khảo (kiểm tra ngày 23/10/2026):
- Atlassian Community, Upcoming change to Bitbucket Cloud SSH access (bản cập nhật 21/10/2026 có lịch brownout): https://community.atlassian.com/forums/Bitbucket-articles/Upcoming-change-to-Bitbucket-Cloud-SSH-access-move-from/ba-p/3234032
- Host key chính thức của Bitbucket: https://bitbucket.org/site/ssh
- BCLOUD-24132, known_hosts của Pipelines: https://jira.atlassian.com/browse/BCLOUD-24132
- BAM-26573, Bamboo: https://jira.atlassian.com/browse/BAM-26573
- Port 22 is blocked on local network: https://support.atlassian.com/bitbucket-cloud/kb/port-22-is-blocked-on-local-network