Authenticating By Public Key (OpenSSH)

SSH is a protocol for secure, remote logins and file copying; and OpenSSH, provided with most Linux distributions, is its most popular implementation. This recipe, selected from Chapter 6 on "Protecting Outgoing Network Connections," shows you how to use public-key authentication to prove your identity to a remote OpenSSH server, a technique more secure than using login passwords. 

Problem
 

You want to set up public-key authentication between an OpenSSH client and an OpenSSH server. 

Solution 

  1. Generate a key if necessary: 

    $ mkdir -p ~/.ssh  If it doesn't already exist
    $ chmod 700 ~/.ssh
    $ cd ~/.ssh
    $ ssh-keygen -t dsa

  2. Copy the public key to the remote host: 

    $ scp -p id_dsa.pub remoteuser@remotehost:
    Password: ********

  3. Log into the remote host and install the public key: 

    $ ssh -l remoteuser remotehost
    Password: ********
    remotehost$ mkdir -p ~/.ssh If it doesn't already exist
    remotehost$ chmod 700 ~/.ssh
    remotehost$ cat id_dsa.pub >> ~/.ssh/authorized_keys  (Appending)
    remotehost$ chmod 600 ~/.ssh/authorized_keys
    remotehost$ mv id_dsa.pub ~/.ssh Optional, just to be organized
    remotehost$ logout

  4. Log back in via public-key authentication: 

    $ ssh -l remoteuser remotehost 
    Enter passphrase for key '/home/smith/.ssh/id_dsa': ********

Tip 

OpenSSH public keys go into the file  ~/.ssh/authorized_keys. Older versions of OpenSSH, however, require SSH-2 protocol keys to be in  ~/.ssh/authorized_keys2

Discussion 

Public-key authentication lets you prove your identity to a remote host using a cryptographic key instead of a login password. SSH keys are more secure than passwords because keys are never transmitted over the network, whereas passwords are (albeit encrypted). Also, keys are stored encrypted, so if someone steals yours, it's useless without the passphrase for decrypting it. A stolen password, on the other hand, is immediately usable. 

An SSH "key" is actually a matched pair of keys stored in two files. The private or secret key remains on the client machine, encrypted with a passphrase. The public key is copied to the remote (server) machine. When establishing a connection, the SSH client and server perform a complex negotiation based on the private and public key, and if they match (in a cryptographic sense), your identity is proven and the connection succeeds. 

To set up public-key authentication, first create an OpenSSH key pair, if you don't already have one: 

$ ssh-keygen -t dsa
Generating public/private dsa key pair.
Enter file in which to save the key (/home/smith/.ssh/id_dsa): 
Enter passphrase (empty for no passphrase): *******
Enter same passphrase again: *******
Your identification has been saved in id_dsa
Your public key has been saved in id_dsa.pub.
The key fingerprint is: 76:00:b3:e8:99:1c:07:9b:84:af:67:69:b6:b4:12:17 
   smith@mymachine

Copy the public key to the remote host using password authentication: 

$ scp ~/.ssh/id_dsa.pub remoteuser@remotehost:
Password: *********
id_dsa.pub      100% |*****************************|     736    00:03


Log into the remote host using password authentication: 

$ ssh -l remoteuser remotehost
Password: ********

If your local and remote usernames are the same, you can omit the  -l remoteuser part and just type  ssh remotehost

On the remote host, create the  ~/.ssh directory if it doesn't already exist and set its mode appropriately: 

remotehost$ mkdir -p ~/.ssh 
remotehost$ chmod 700 ~/.ssh
 

Then append the contents of  id_dsa.pub to  ~/.ssh/authorized_keys

remotehost$ cat id_dsa.pub >> ~/.ssh/authorized_keys    (Appending)
remotehost$ chmod 600 ~/.ssh/authorized_keys


Log out of the remote host and log back in. This time you'll be prompted for your key passphrase instead of your password: 

$ ssh -l remoteuser remotehost 
Enter passphrase for key '/home/smith/.ssh/id_dsa': *******
 

and you're done! If things aren't working, rerun ssh with the -v option (verbose) to help diagnose the problem. 

The SSH server must be configured to permit public-key authentication, which is the default: 

/etc/ssh/sshd_config: 
PubkeyAuthentication yes  If no, change it and restart sshd 

SSH-2 Key File Formats

The two major implementations of SSH-OpenSSH and SSH Secure Shell ("SSH2")-use different file formats for SSH-2 protocol keys. (Their SSH-1 protocol keys are compatible.) OpenSSH public keys for the SSH-2 protocol begin like this:


ssh-dss A9AAB3NzaC1iGMqHpSCEliaouBun8FF9t8p...

or:


ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAIEA3DIqRox...

SSH Secure Shell public keys for the SSH-2 protocol look like this:


---- BEGIN SSH2 PUBLIC KEY ---- 
AAAAB3NzaC1kc3MAAACBAM4a2KKBE6zhPBgRx4q6Dbjxo5hXNKNWYIGkX/W/k5PqcCH0J6 ...
---- END SSH2 PUBLIC KEY ----

These keys are installed differently too. For OpenSSH, you insert your public keys into the file ~/.ssh/authorized_keys. For SSH Secure Shell, you copy your public key files into the directory ~/.ssh2 and reference them in the file ~/.ssh2/authorization by name:


Key public_key_filename

As for private keys, OpenSSH has no special requirements for installation, but SSH Secure Shell does. You must reference them in the file ~/.ssh2/identification by name:


IdKey private_key_filename


Excerpt first appeared at  linux.oreilly.net  

About the Author:
The Linux Security Cookbook  includes real solutions to a wide range of targeted problems, such as sending encrypted email within Emacs, restricting access to network services at particular times of day, firewalling a webserver, preventing IP spoofing, setting up key-based SSH authentication, and much more. With over 150 ready-to-use scripts and configuration files, this unique book helps administrators secure their systems without having to look up specific syntax.
在MongoDB中,验证MongoCredential是指使用用户名和密码来验证用户身份以访问MongoDB数据库。 要验证MongoCredential,需要使用MongoClient对象和MongoCredential对象。首先,我们需要创建一个MongoCredential实例,该实例需要指定验证方法、数据库名称、用户名和密码。验证方法可以是从MongoCredential类的静态方法中选择,如MONGODB-CR、SCRAM-SHA-1、SCRAM-SHA-256等。然后,我们可以使用MongoClient对象的withCredential()方法来设置验证凭据。 接下来,我们可以通过调用MongoClient对象的connect()方法来建立与MongoDB的连接。当使用验证凭据时,如果用户名和密码与数据库中的凭据匹配,连接将成功建立。否则,将抛出错误,表示身份验证失败。 以下是使用Java语言进行MongoCredential验证的示例代码: ```java import com.mongodb.*; import org.bson.codecs.configuration.CodecRegistry; import org.bson.codecs.pojo.PojoCodecProvider; public class MongoDBAuth { public static void main(String[] args) { String host = "localhost"; int port = 27017; String database = "mydatabase"; String username = "myuser"; String password = "mypassword"; MongoClientSettings settings = MongoClientSettings.builder() .codecRegistry(CodecRegistry.DEFAULT) .applyToClusterSettings(builder -> builder.hosts(Arrays.asList(new ServerAddress(host, port)))) .credential(MongoCredential.createCredential(username, database, password.toCharArray())) .build(); MongoClient mongoClient = MongoClients.create(settings); // 连接成功执行其他操作 System.out.println("连接成功!"); mongoClient.close(); } } ``` 在这个例子中,我们使用MongoClientSettings.Builder类来设置MongoClient的配置。我们指定了主机和端口号,并创建了一个MongoCredential对象。然后,我们使用这些设置来创建一个MongoClient实例并建立与MongoDB的连接。最后,我们在连接成功后执行其他操作,并在结束时关闭连接。 总之,通过验证MongoCredential,我们可以使用用户名和密码来验证用户身份以访问MongoDB数据库。这是确保MongoDB数据库安全性的重要措施之一。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值