ฉันจะสร้างไฟล์คีย์ส่วนตัวที่ยอมรับได้สำหรับแอสเซมบลี WinSCP เพื่อตรวจสอบสิทธิ์ได้อย่างไร

ฉันกำลังพยายามใช้ชุดประกอบ WinSCP เพื่ออัปโหลดไปยังเซิร์ฟเวอร์ FTP ของเรา เรามีคีย์ส่วนตัวทั่วไปจัดเก็บไว้ในฐานข้อมูลของเราที่เราดึงข้อมูลและใช้สำหรับการตรวจสอบสิทธิ์ (ขณะนี้ใช้งานได้กับการอัปโหลด Java usith JSch) อย่างไรก็ตาม WinSCP ต้องการชื่อพาธของไฟล์

ฉันกำลังพยายามเขียนคีย์ส่วนตัวของเราลงในไฟล์เพื่อให้ WinSCP ใช้สำหรับการตรวจสอบสิทธิ์ แต่ฉันได้รับข้อผิดพลาดต่อไปนี้:

"C:\[..path..].\key.txt (ไม่ใช่รูปแบบไฟล์คีย์ที่รู้จัก)"

รหัสอัปโหลด:

String host = token.hostName;
String user = token.userID;
String sshKey = token.sshKey;

//write key to temp file
String keyFile = AppDomain.CurrentDomain.BaseDirectory+@".\key.txt";
FileStream temp = new FileStream(keyFile, FileMode.Create);
temp.Write(Encoding.ASCII.GetBytes(sshKey), 0 , 0);
temp.Close();

try {
    // Setup session options
    SessionOptions sessionOptions = new SessionOptions {
        Protocol = Protocol.Sftp,
        HostName = host,
        UserName = user,
        SshPrivateKeyPath = keyFile,
        GiveUpSecurityAndAcceptAnySshHostKey = true
    };

    using (Session session = new Session()) {
        // Connect
        session.Open(sessionOptions);
        session.DisableVersionCheck = true;

        // Upload files
        TransferOptions transferOptions = new TransferOptions();
        transferOptions.TransferMode = TransferMode.Binary;

        TransferOperationResult transferResult;
        transferResult = session.PutFiles(@resultsFolder+"*", depthDir, false, transferOptions);

        // Throw on any error
        transferResult.Check();

        // Print results
        foreach (TransferEventArgs transfer in transferResult.Transfers) {
            Console.WriteLine("Upload of {0} succeeded", transfer.FileName);
        }
    }               
} catch (Exception e) {
    Console.WriteLine("Error: {0}", e);
} finally {
    // delete file with key
    File.Delete(keyFile);
}

person Fueled By Coffee    schedule 15.06.2018    source แหล่งที่มา
comment
ฉันสามารถสรุปได้ว่าคุณต้องการอ่านเนื้อหาของไฟล์หรือไม่?   -  person Simon Price    schedule 15.06.2018
comment
key.txt ของคุณมีรูปแบบใด แสดงให้เราเห็น   -  person Martin Prikryl    schedule 15.06.2018
comment
key.txt เป็นเพียงสตริงอักขระยาว (คีย์ส่วนตัว)   -  person Fueled By Coffee    schedule 15.06.2018
comment
แสดงให้เราเห็นว่าคุณใช้ไฟล์คีย์ใน JSch อย่างไร   -  person Martin Prikryl    schedule 15.06.2018


คำตอบ (2)


มันช้าไปหน่อย แต่รหัส winscp ของคุณใช้งานได้ ฉันแค่ต้องแปลงคีย์ส่วนตัวของฉันเป็นมาตรฐาน PuTTY ในการทำเช่นนั้นเพียงแปลงคีย์ของคุณโดยใช้

winscp.exe /keygen oldformat.key /output=newformat.key

คุณสามารถใช้ PuTTY ได้ แต่ฉันพบว่า winscp ง่ายกว่ามากเมื่อคุณมีมันอยู่แล้ว

person JerryTheGreek    schedule 18.09.2019

หากฉันเดาถูกต้องคุณจะต้องปรับโค้ดของคุณจากสิ่งนี้

String keyFile = AppDomain.CurrentDomain.BaseDirectory+@".\key.txt";

สำหรับสิ่งนี้

var keyFilePath = $"{AppDomain.CurrentDomain.BaseDirectory} \\key.txt";
var keyText = File.ReadAllText(keyFilePath);

ฉันได้แบ่งมันออกเป็นสองตัวแปรที่นี่เพื่อให้คุณมีความเข้าใจที่ชัดเจน แต่คุณสามารถทำทุกอย่างได้ในบรรทัดเดียว

person Simon Price    schedule 15.06.2018
comment
ฉันไม่คิดว่าการเปลี่ยนแปลงของคุณสำเร็จอะไรได้นอกจากต้องใช้ C# เวอร์ชันใหม่ - คุณได้ลบ . ที่ไม่เกี่ยวข้องออก (ซึ่งอาจไม่เป็นอันตรายหาก BaseDirectory ลงท้ายด้วยเครื่องหมายทับ) และแทรกช่องว่างที่ไม่เกี่ยวข้อง (ซึ่งไม่เป็นอันตราย) - person Ben Voigt; 18.09.2019