
Bitbucket App Password Deprecated: Cách Setup SSH Key Để Giải Quyết Git Push/Git Pull
Hướng dẫn setup SSH Key cho Bitbucket trên MacBook/Windows để fix lỗi git pull/git push do App Password deprecated. Có command, cách test, đổi remote SSH.
Nếu bạn đang dùng Bitbucket qua HTTPS, có thể một ngày bạn chạy:
git pullhoặc:
git push origin mainvà gặp lỗi:
remote: App passwords are deprecated and must be replaced with API tokens.
fatal: unable to access 'https://bitbucket.org/anhtran/atdevblog.git/': The requested URL returned error: 410
Hoặc:
fatal: Authentication failed
Nguyên nhân thường gặp là project vẫn đang dùng Bitbucket App Password cũ hoặc credential HTTPS cũ đã lưu trong máy. Cách xử lý nhanh là chuyển sang API Token, nhưng nếu bạn muốn setup ổn định hơn cho máy dev cá nhân, đặc biệt là MacBook dùng thường xuyên để push/pull code, thì SSH Key là một lựa chọn rất sạch và tiện.
Bài viết này hướng dẫn cách setup SSH Key cho Bitbucket trên MacBook, giải thích rõ từng command, chạy lệnh ở đâu, kết quả như thế nào là đúng, và Windows có gì khác so với macOS.
1. Khi nào nên dùng SSH Key thay vì HTTPS/API Token?
Bạn nên dùng SSH Key nếu:
Bạn thường xuyên push/pull code từ máy cá nhân.
Bạn không muốn mỗi lần Git lại hỏi password/API Token.
Bạn không muốn nhúng token trực tiếp vào Git remote URL.
Bạn muốn tránh lỗi Bitbucket App Password deprecated khi dùng HTTPS.
Bạn muốn setup Git gọn, ổn định, ít phụ thuộc credential cache.
Ví dụ remote HTTPS cũ:
https://bitbucket.org/anhtran/atdevblog.gitSau khi đổi sang SSH, remote sẽ là:
git@bitbucket.org:anhtran/atdevblog.gitTừ đó, Git sẽ xác thực bằng SSH Key thay vì hỏi password hoặc API Token.
2. Ví dụ repository trong bài
Trong bài này, ví dụ repo là:
anhtran/atdevblog.gitRemote HTTPS:
https://bitbucket.org/anhtran/atdevblog.gitRemote SSH:
git@bitbucket.org:anhtran/atdevblog.gitBạn chỉ cần thay anhtran/atdevblog.git bằng workspace/repository thực tế của bạn.
3. Setup SSH Key trên MacBook
Bước 1: Mở Terminal
Trên MacBook, mở app:
TerminalBạn có thể chạy các lệnh tạo SSH key ở bất kỳ thư mục nào, vì đường dẫn ~/.ssh/... luôn trỏ về thư mục SSH trong Home của user hiện tại.
Ví dụ:
~/.ssh/bitbucket_atdevblognghĩa là file key sẽ nằm tại:
/Users/<ten-user-cua-ban>/.ssh/bitbucket_atdevblogBạn không cần phải cd vào project ở bước tạo SSH key.
Bước 2: Tạo SSH Key
Chạy lệnh:
ssh-keygen -t ed25519 -C "anhtran-local-bitbucket" -f ~/.ssh/bitbucket_atdevblog
Giải thích từng phần:
ssh-keygenLệnh dùng để tạo SSH key.
-t ed25519Chọn loại key là Ed25519. Đây là loại key hiện đại, gọn và được khuyến nghị sử dụng phổ biến hiện nay.
-C "anhtran-local-bitbucket"Phần comment để bạn dễ nhận biết key này dùng cho mục đích gì. Bạn có thể đặt là:
"anhtran-macbook-bitbucket"hoặc:
"atdevblog-local-bitbucket"-f ~/.ssh/bitbucket_atdevblogChỉ định tên file key sẽ được tạo. Trong ví dụ này, private key sẽ nằm tại:
~/.ssh/bitbucket_atdevblogvà public key sẽ nằm tại:
~/.ssh/bitbucket_atdevblog.pubKhi được hỏi passphrase:
Enter passphrase (empty for no passphrase):Bạn có thể nhập passphrase để tăng bảo mật, hoặc để trống nếu muốn thao tác Git nhanh hơn trên máy cá nhân. Nếu để trống, cần đảm bảo máy cá nhân được bảo vệ tốt bằng mật khẩu, Touch ID hoặc FileVault.
Bước 3: Copy public key
Sau khi tạo key xong, chạy:
cat ~/.ssh/bitbucket_atdevblog.pubKết quả sẽ có dạng:
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIxxxxxxxxxxxxxxxx anhtran-local-bitbucketCopy toàn bộ dòng này.
Lưu ý rất quan trọng:
Chỉ copy file
.pub.Không copy private key.
Không gửi file
~/.ssh/bitbucket_atdevblogcho người khác.Không commit private key lên Git.
Public key là file được phép đưa lên Bitbucket. Private key phải luôn nằm an toàn trên máy của bạn.
Bước 4: Add SSH Key vào Bitbucket
Vào Bitbucket trên trình duyệt:
Personal Bitbucket settings → Security → SSH keys → Add key

Sau đó nhập:
Label: MacBook - atdevblogDán public key vừa copy vào ô key.
Ví dụ:
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIxxxxxxxxxxxxxxxx anhtran-local-bitbucketSau đó nhấn:
Add key
Bước 5: Tạo hoặc sửa file SSH config
Tiếp theo, bạn cần tạo file config để máy biết khi kết nối tới Bitbucket thì dùng đúng SSH key nào.
Lệnh:
nano ~/.ssh/configNếu file chưa tồn tại, lệnh nano ~/.ssh/config sẽ tạo file mới.
Nếu file đã tồn tại, lệnh này sẽ mở file hiện tại để bạn chỉnh sửa.
Bước 6: Thêm cấu hình SSH cho Bitbucket
Thêm đoạn sau vào file:
Host bitbucket.org
HostName bitbucket.org
User git
IdentityFile ~/.ssh/bitbucket_atdevblog
IdentitiesOnly yes
Giải thích từng dòng:
Host bitbucket.orgĐây là tên host bạn sẽ kết nối. Khi Git gặp remote dạng:
git@bitbucket.org:anhtran/atdevblog.gitSSH sẽ dùng block cấu hình này.
HostName bitbucket.orgĐịa chỉ server thật mà SSH sẽ kết nối tới. Trong trường hợp này là Bitbucket.
User gitUser SSH dùng để kết nối Bitbucket luôn là git. Đây không phải username Bitbucket cá nhân của bạn.
IdentityFile ~/.ssh/bitbucket_atdevblogChỉ định private key cần dùng khi kết nối tới Bitbucket.
Trong ví dụ này, SSH sẽ dùng file:
~/.ssh/bitbucket_atdevblogIdentitiesOnly yesYêu cầu SSH chỉ dùng đúng key đã chỉ định trong IdentityFile, tránh việc SSH thử quá nhiều key khác và gây lỗi xác thực.
Sau khi thêm xong, nhấn:
Control + O
Enter
Control + X
để lưu và thoát khỏi nano.
Bước 7: Set permission cho file SSH
Chạy:
chmod 700 ~/.ssh
chmod 600 ~/.ssh/bitbucket_atdevblog
chmod 644 ~/.ssh/bitbucket_atdevblog.pub
chmod 600 ~/.ssh/configMục đích là đảm bảo SSH key không bị để quyền quá rộng.
Nếu quyền file private key quá mở, SSH có thể từ chối sử dụng key.
Bước 8: Test kết nối SSH tới Bitbucket
Chạy:
ssh -T git@bitbucket.orgKết quả như thế nào là OK?
Nếu thành công, bạn có thể thấy thông báo gần giống:
authenticated via ssh key.
You can use git to connect to Bitbucket. Shell access is disabled
Hoặc nội dung tương tự báo rằng bạn đã xác thực thành công bằng SSH key.
Lưu ý:
Shell access is disabled
là bình thường. Bitbucket chỉ cho phép dùng SSH để Git clone/pull/push, không cho bạn mở shell trực tiếp như SSH vào server Linux.
Nếu thấy dòng xác thực thành công, nghĩa là SSH key đã được setup đúng.
4. Đổi remote local sang SSH
Sau khi SSH key đã hoạt động, bạn cần đổi remote của project từ HTTPS sang SSH.
Bước 1: Đi vào thư mục project local
Lệnh này phải chạy trong thư mục project Git trên máy bạn.
Ví dụ:
cd ~/Projects/atdevblogHoặc thư mục thực tế của bạn:
cd /path/to/your/projectKiểm tra có đúng là Git repo không:
git statusNếu thấy thông tin branch hiện tại, ví dụ:
On branch mainnghĩa là bạn đang đứng đúng trong project Git.
Bước 2: Kiểm tra remote hiện tại
Chạy:
git remote -vNếu đang dùng HTTPS, bạn sẽ thấy dạng:
origin https://bitbucket.org/anhtran/atdevblog.git (fetch)
origin https://bitbucket.org/anhtran/atdevblog.git (push)Bước 3: Đổi remote sang SSH
Chạy:
git remote set-url origin git@bitbucket.org:anhtran/atdevblog.gitSau đó kiểm tra lại:
git remote -vKết quả đúng sẽ là:
origin git@bitbucket.org:anhtran/atdevblog.git (fetch)
origin git@bitbucket.org:anhtran/atdevblog.git (push)Nếu đã thấy git@bitbucket.org:... nghĩa là remote đã chuyển sang SSH thành công.
5. Test git pull và git push
Test git pull
Chạy:
git pull origin mainNếu đã mới nhất, kết quả có thể là:
Already up to date.
Nếu có code mới, Git sẽ hiển thị thông tin update file/commit.
Cả hai trường hợp đều là OK miễn là không còn lỗi authentication.
Test git push
Nếu bạn có quyền push vào repo, chạy:
git push origin mainKết quả như thế nào là OK?
Nếu không có gì mới để push, bạn có thể thấy:
Everything up-to-date
Nếu có commit mới, kết quả có thể hiển thị:
Enumerating objects: ...
Counting objects: ...
Compressing objects: ...
Writing objects: ...
To bitbucket.org:anhtran/atdevblog.git
old_commit..new_commit main -> main
Nếu thấy push lên bitbucket.org:anhtran/atdevblog.git thành công và không còn Authentication failed, nghĩa là setup SSH đã OK.
6. Windows làm có khác gì so với macOS không?
Có khác một chút, nhưng logic chính vẫn giống nhau.
Cùng một flow:
Tạo SSH key → Add public key vào Bitbucket → Tạo SSH config → Test ssh -T → Đổi remote sang SSH → Test pull/push
Điểm khác chủ yếu nằm ở terminal, đường dẫn file và cách mở file config.
Trên Windows nên dùng terminal nào?
Bạn có thể dùng một trong các lựa chọn sau:
Git Bash
PowerShell
Windows Terminal
Terminal tích hợp trong VS Code
Nếu bạn đã cài Git for Windows, dùng Git Bash thường dễ nhất vì command gần giống macOS/Linux.
Tạo SSH key bằng Git Bash
Mở Git Bash và chạy:
ssh-keygen -t ed25519 -C "anhtran-windows-bitbucket" -f ~/.ssh/bitbucket_atdevblogTrên Git Bash, dấu ~ vẫn trỏ về thư mục home của user.
Thường tương ứng với:
C:\Users\<YourUser>\.ssh\
Ví dụ file private key:
C:\Users\AnhTran\.ssh\bitbucket_atdevblog
Public key:
C:\Users\AnhTran\.ssh\bitbucket_atdevblog.pub
Copy public key:
cat ~/.ssh/bitbucket_atdevblog.pubSau đó add vào Bitbucket giống như trên Mac:
Personal Bitbucket settings → Security → SSH keys → Add key
Tạo SSH config
Nếu dùng Git Bash, bạn có thể chạy:
nano ~/.ssh/configNếu máy không có nano, dùng Notepad:
notepad ~/.ssh/configHoặc mở trực tiếp file:
C:\Users\<YourUser>\.ssh\configThêm nội dung:
Host bitbucket.org
HostName bitbucket.org
User git
IdentityFile ~/.ssh/bitbucket_atdevblog
IdentitiesOnly yesÝ nghĩa từng dòng giống hệt macOS:
Host bitbucket.org: cấu hình cho kết nối tới Bitbucket.HostName bitbucket.org: server thật cần kết nối.User git: user SSH của Bitbucket làgit.IdentityFile ~/.ssh/bitbucket_atdevblog: key sẽ dùng để xác thực.IdentitiesOnly yes: chỉ dùng đúng key này.
Test SSH
Trong Git Bash, chạy:
ssh -T git@bitbucket.orgKết quả OK cũng tương tự macOS:
authenticated via ssh key.
You can use git to connect to Bitbucket. Shell access is disabled
Nếu lần đầu kết nối, Windows/Git Bash có thể hỏi:
Are you sure you want to continue connecting (yes/no/[fingerprint])?
Nhập:
yes
Sau đó chạy lại lệnh test nếu cần.
Đổi remote sang SSH
Bước này giống hệt macOS.
Bạn cần đứng trong thư mục project Git.
Ví dụ:
cd /c/Users/AnhTran/Projects/atdevblogKiểm tra:
git remote -vĐổi remote:
git remote set-url origin git@bitbucket.org:anhtran/atdevblog.gitTest pull:
git pull origin mainTest push:
git push origin mainKhác biệt quan trọng giữa Windows và macOS
Nội dung | macOS | Windows |
|---|---|---|
Terminal khuyên dùng | Terminal mặc định | Git Bash hoặc Windows Terminal |
Thư mục SSH |
|
|
Lệnh mở config |
|
|
Copy public key |
|
|
SSH command |
| Giống macOS |
Git remote SSH |
| Giống macOS |
Lỗi thường gặp | sai permission key, config sai | chưa cài Git/OpenSSH, dùng nhầm terminal, path sai |
7. Lỗi thường gặp khi setup SSH Key Bitbucket
Lỗi 1: Permission denied publickey
Lỗi:
git@bitbucket.org: Permission denied (publickey).
fatal: Could not read from remote repository.
Nguyên nhân có thể là:
Chưa add public key vào Bitbucket.
Add nhầm key.
SSH config trỏ sai
IdentityFile.Git đang dùng key khác.
Account Bitbucket không có quyền vào repo.
Cách kiểm tra:
ssh -T git@bitbucket.orgNếu test SSH chưa OK thì chưa nên test git pull/git push.
Lỗi 2: Remote vẫn là HTTPS
Nếu bạn đã setup SSH nhưng vẫn thấy lỗi App Password/API Token, có thể remote vẫn đang dùng HTTPS.
Kiểm tra:
git remote -vNếu vẫn thấy:
https://bitbucket.org/anhtran/atdevblog.git
hãy đổi sang SSH:
git remote set-url origin git@bitbucket.org:anhtran/atdevblog.gitLỗi 3: Host key verification failed
Lỗi:
Host key verification failed.
fatal: Could not read from remote repository.
Thử chạy:
ssh -T git@bitbucket.orgNếu hệ thống hỏi có tin tưởng host không, nhập:
yesSau đó test lại:
git pull origin mainLỗi 4: Máy có nhiều SSH key
Nếu máy có nhiều key, SSH có thể dùng nhầm key.
Cách xử lý là khai báo rõ trong file:
~/.ssh/configNội dung:
Host bitbucket.org
HostName bitbucket.org
User git
IdentityFile ~/.ssh/bitbucket_atdevblog
IdentitiesOnly yesNếu vẫn lỗi, chạy debug:
ssh -vT git@bitbucket.orgLệnh này giúp xem SSH đang dùng key nào.
Lỗi 5: Push bị denied dù SSH test OK
Nếu:
ssh -T git@bitbucket.orgđã OK nhưng:
git push origin mainvẫn lỗi permission, có thể account hoặc SSH key của bạn chỉ có quyền read repo, không có quyền write.
Cách xử lý:
Kiểm tra quyền của account trong repository.
Kiểm tra bạn có quyền write vào branch
mainkhông.Kiểm tra branch có rule/protection không.
Thử push sang branch khác nếu project không cho push trực tiếp vào
main.
8. Checklist nhanh sau khi setup thành công
Kiểm tra SSH key đã tạo:
ls -la ~/.sshKiểm tra config:
cat ~/.ssh/configTest SSH:
ssh -T git@bitbucket.orgKết quả OK nếu thấy xác thực thành công bằng SSH key.
Kiểm tra remote:
git remote -vRemote đúng nếu thấy:
git@bitbucket.org:anhtran/atdevblog.gitTest pull:
git pull origin mainOK nếu không còn lỗi authentication.
Test push:
git push origin mainOK nếu thấy Everything up-to-date hoặc push commit thành công.
9. Nên dùng SSH Key hay API Token?
Trường hợp | Nên dùng |
|---|---|
Máy cá nhân thường xuyên push/pull | SSH Key |
Cần fix nhanh HTTPS trên local | API Token |
Git/Sourcetree không hỏi password | Tạm thời nhúng API Token vào remote URL |
Server deploy lâu dài | SSH Key hoặc Repository Access Token |
CI/CD pipeline | Repository Access Token hoặc CI/CD Secret |
Chỉ cần pull code | Chỉ cấp quyền read |
Cần push code | Cần quyền write |
Nếu bạn đã setup SSH Key thành công trên MacBook, đây là hướng rất ổn cho môi trường dev cá nhân.
Còn với server staging/production, không nên copy private key từ local lên server nếu không cần. Tốt hơn là tạo một SSH key riêng ngay trên server hoặc dùng Repository Access Token cho deploy.
10. Kết luận
Khi Bitbucket App Password bị deprecated, các lệnh Git qua HTTPS như:
git pull
git clone
git pushcó thể gặp lỗi authentication.
Có nhiều cách xử lý, nhưng nếu bạn dùng máy cá nhân để làm việc hằng ngày, setup SSH Key là một cách sạch, ổn định và dễ duy trì.
Flow chuẩn là:
ssh-keygen -t ed25519 -C "anhtran-local-bitbucket" -f ~/.ssh/bitbucket_atdevblog
cat ~/.ssh/bitbucket_atdevblog.pub
nano ~/.ssh/config
ssh -T git@bitbucket.org
git remote set-url origin git@bitbucket.org:anhtran/atdevblog.git
git pull origin main
git push origin mainĐiểm cần nhớ:
Tạo SSH key ở local nếu bạn muốn push/pull từ máy local.
Tạo SSH key trên server nếu server cần tự
git pullđể deploy.Không chia sẻ private key.
Không commit private key lên Git.
Remote SSH đúng format là:
git@bitbucket.org:anhtran/atdevblog.gitNếu test SSH OK và git remote -v đã chuyển sang SSH, bạn có thể push/pull code mà không cần dùng App Password hoặc API Token trong remote URL nữa.
CTA
Nếu bạn đang gặp lỗi App passwords are deprecated, Authentication failed hoặc error 410 khi dùng Bitbucket, hãy kiểm tra lại Git remote ngay. Nếu bạn làm việc trên máy cá nhân, hãy cân nhắc chuyển sang SSH Key để việc push/pull code ổn định và an toàn hơn.