Commit Graph

2 Commits (889a92e919c1d1e610aeb2c3aeed879034714c83)

Author SHA1 Message Date
RyuJongJin 8ca9184fdc WIP 보안 검토 7: FTPS 사설 CA 체인 시험 - 지문은 서버 인증서 (잎) 것 (검토 대기)
관리자 지시 (10/18): 사설 CA → 서버 인증서 체인을 시험 서버에 만들어 (tool/ftp_test_server.py --chain, cryptography 로 시험 전용 CA · 잎, 서버는 use_certificate_chain_file 로 체인 전체를 보냄)
onBadCertificate 가 넘기는 인증서가 잎인지 확인했다 → 잎이다 (고칠 것 없음). 이것을 시험으로 남긴다:
- 처음 연결: FtpCertException 의 지문 = 잎 지문 (CA 지문 아님), subject 에 127.0.0.1
- CA 지문을 믿고 있으면 "바뀜" 으로 막는다 (같은 CA 가 서명한 다른 인증서를 받지 않게)
- 잎 지문을 믿으면 명령 · 자료 연결 (PROT P) 모두 됨
시험 서버는 잎 지문 (FINGERPRINT) 과 함께 CA_FINGERPRINT 를 알린다.

시험: ftp_test (새 1) 통과.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-18 02:40:50 +09:00
RyuJongJin dd9e93b4fe WIP l FTP · FTPS: 탐색기 원격 탭 (WebDAV · SFTP 와 같은 길) - dart:io 로 직접, 처음 값 FTPS (검토 대기)
관리자 지시 (10/17, l): FTP · FTPS 를 탐색기 원격 탭으로. 평문 FTP 는 "암호화 안 됨" 경고, 처음 값은 FTPS, 비밀번호는 안전 저장소.
- lib/core/ftp.dart (새, 패키지 없음 - ftpconnect 3.0.0 은 dartssh2 ^3 에 묶여 우리 dartssh2 4.1.0 과 함께 못 씀):
  · 명령 채널 RawSocket → 명시 FTPS 는 AUTH TLS 뒤 RawSecureSocket.secure (같은 연결을 TLS 로), 암시 FTPS (990) 는 연결하자마자 TLS. PBSZ 0 · PROT P
  · 목록 MLSD (FEAT 에 MLST 가 있으면) 아니면 LIST (유닉스 꼴), 정보 · 만들기 · 지우기 (안쪽까지) · 옮기기 (RNFR/RNTO)
  · 받기 · 올리기는 따로 연결 (REST 로 부분 읽기 - 동영상 건너뛰기 · 이어 받기). 자료 연결의 TLS 는 명령에 150/125 를 받은 뒤
  · 자료 연결 주소는 명령 채널의 서버 주소로만 (PASV 가 알려 준 다른 주소로 가지 않음 - FTP 바운스 막기). EPSV 먼저
  · FTPS 로 고른 서버가 평문만 되면 몰래 평문으로 내려가지 않고 이유를 알림
  · 자체 서명 인증서: SFTP 호스트 키처럼 처음 한 번 지문 (SHA-256) 을 보이고 믿을지 묻고 (TOFU), 바뀌면 막음. 공인 인증서는 그대로
  · DNS 강제를 따름 (FtpRegistry.resolveWithDns - SFTP 와 같게)
- vfs: ftp://<서버 id>/<경로> (isFtp · noStreamUrl → 받아서 열기, 표시 📂 · 평문은 ⚠, 임시 폴더 jj_ftp)
- 설정: ftpServers (비밀번호는 ftp.pw.<id> 안전 저장소, 설정 파일 · .bak · 보관본에서 뺌), 마스터 초기화에서 지움
- 화면: 환경 설정 > 파일 탐색기 > FTP · FTPS (추가 · 고치기 · 지우기 · 연결 확인, 암호화 고르기 - 평문은 빨간 경고),
  탐색기 위 줄 탭 (평문은 ⚠ 이름) · [FTP 서버 추가] · 좁은 창 메뉴 · 길게 누르기 고치기 · 인증서 지문 안내 [지문 확인하고 연결]

시험: test/ftp_test.dart 7 - 설정의 비밀번호 (안전 저장소 · 보관본), 목록 줄 읽기, 실제 서버 (tool/ftp_test_server.py = pyftpdlib 2.2.0 ·
pyOpenSSL 26.4.0, 시험용 파이썬에만 - 앱에 안 들어감): 명시 FTPS (인증서 TOFU · 바뀐 인증서 막기 · 폴더 · 쓰기 · 목록 · 부분 읽기 · 옮기기 · 지우기),
암시 FTPS, 평문 FTP (+ FTPS 서버가 평문만이면 이유), 틀린 비밀번호 · 비밀번호 없음 · 닿지 않음.
sftp · master_lock · settings_store · webdav · explorer_webdav · explorer · sftp_explorer · licenses 와 함께 98 통과, analyze 문제 없음, l10n 빠짐 0.
시험 서버 메모: pyftpdlib 2.2.0 + pyOpenSSL 26 은 자료 연결 TLS 닫기에서 끝없이 되풀이해 STOR 가 끝나지 않는다 - 시험 서버에서만 덮어씀.
못 한 것: 실제 NAS (Synology 등) FTPS · TLS 세션 재사용을 요구하는 서버 (vsftpd require_ssl_reuse) 는 확인 못 함 (Dart 는 자료 연결의 TLS 세션 재사용을 못 함),
FTP 스트리밍 재생 (sftp_next 의 다리와 합칠 때 FtpRemote.openReadFrom 을 넣으면 됨), 경로 복사의 ftp:// 꼴.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-18 00:45:33 +09:00