本帖最后由 dql2015 于 2021-12-30 19:40 编辑
#申请原创# @21小跑堂
最近需要使用FTPS服务器(注意不是FTP),网上查询了很多资料,要么是在电脑端的,要么就是嵌入式linux端的FTP,没有在嵌入式linux端部署FTPS服务器的案例,我想主要原因是用FTPS服务器少吧,目前很多嵌入式linux板卡官方提供的都是sftp服务器。楼主经过一番摸索试错,终于成功了,这里分享下经验另外也是作为一种学习的记录备忘。
步骤还是比较繁琐的,涉及到目录的地方需要特别注意。主要分为四大部分,一是openssl库的交叉编译(加密安全认证);二是vsftpd的交叉编译;三是在嵌入式linux端部署配置ftps;最后是测试结果。
一、openssl交叉编译
使用openssl1.0.2t版本,不建议使用其它版本,因为openssl更新十分频繁,使用其它版本可能交叉编译不成功或者版本与其它软件要求的openssl版本不一致。
编译配置为:在交叉编译主机上操作:
./config no-asm shared --prefix=/etc --cross-compile-prefix=arm-linux-gnueabihf-
注意,这里--prefix=/etc否则,编译出的可执行文件openssl无法在板子上运行(请提前备份电脑端/etc目录下的相关内容)。
编译将生成文件夹/etc/bin、/etc/include、/etc/lib、/etc/ssl。
将必要的/etc/bin/openssl拷贝到板子上目录/usr/local/bin;
将必要的/etc/lib/libssl.so、/etc/lib/libssl.so.1.0.0拷贝到板子上目录/usr/local/lib;
将必要的/etc/lib/libcrypto.so、/etc/lib/libcrypto.so.1.0.0拷贝到板子上目录/usr/local/lib;
将必要的/etc/ssl文件夹拷贝到板子上目录/etc,/etc/ssl/目下内容为:certs/、misc/、openssl.cnf、private/;
此时可以在板子上运行命令:
openssl req -new -newkey rsa:2048 -days 365 -nodes -x509 -subj "/C=CN/ST=HB/L=WuHan/O=XiaoMi/OU=YanFaBu/CN=test001" -keyout /etc/ssl/private/vsftpd.key -out /etc/ssl/certs/vsftpd.crt
生成私钥vsftpd.key和证书vsftpd.crt。
二、vsftpd交叉编译
使用vsftpd-3.0.3版本,修改Makefile第2行CC为交叉编译工具;
修改Makefile第6行,新增-I/etc/include;(这里指定交叉编译了的openssl相应目录)
修改Makefile第11行LIBS为-L/etc/lib -lssl -lcrypto -lcrypt;(这里指定交叉编译了的openssl相应目录)
修改builddefs.h第6行为#define VSF_BUILD_SSL
编译后将生成可执行文件vsftpd,
将必要的vsftpd拷贝到板子上目录/usr/local/bin;
将必要的vsftpd.conf拷贝到板子上目录/etc,vsftpd.conf内容如下:
- # Example config file /etc/vsftpd.conf
- #
- # The default compiled in settings are fairly paranoid. This sample file
- # loosens things up a bit, to make the ftp daemon more usable.
- # Please see vsftpd.conf.5 for all compiled in defaults.
- #
- # READ THIS: This example file is NOT an exhaustive list of vsftpd options.
- # Please read the vsftpd.conf.5 manual page to get a full idea of vsftpd's
- # capabilities.
- #
- #
- # Run standalone? vsftpd can run either from an inetd or as a standalone
- # daemon started from an initscript.
- listen=NO
- #
- # This directive enables listening on IPv6 sockets. By default, listening
- # on the IPv6 "any" address (::) will accept connections from both IPv6
- # and IPv4 clients. It is not necessary to listen on *both* IPv4 and IPv6
- # sockets. If you want that (perhaps because you want to listen on specific
- # addresses) then you must run two copies of vsftpd with two configuration
- # files.
- #listen_ipv6=YES
- #
- # Allow anonymous FTP? (Disabled by default).
- anonymous_enable=NO
- #
- # Uncomment this to allow local users to log in.
- local_enable=YES
- #
- # Uncomment this to enable any form of FTP write command.
- #write_enable=YES
- #
- # Default umask for local users is 077. You may wish to change this to 022,
- # if your users expect that (022 is used by most other ftpd's)
- #local_umask=022
- #
- # Uncomment this to allow the anonymous FTP user to upload files. This only
- # has an effect if the above global write enable is activated. Also, you will
- # obviously need to create a directory writable by the FTP user.
- #anon_upload_enable=YES
- #
- # Uncomment this if you want the anonymous FTP user to be able to create
- # new directories.
- #anon_mkdir_write_enable=YES
- #
- # Activate directory messages - messages given to remote users when they
- # go into a certain directory.
- dirmessage_enable=YES
- #
- # If enabled, vsftpd will display directory listings with the time
- # in your local time zone. The default is to display GMT. The
- # times returned by the MDTM FTP command are also affected by this
- # option.
- use_localtime=YES
- #
- # Activate logging of uploads/downloads.
- xferlog_enable=YES
- #
- # Make sure PORT transfer connections originate from port 20 (ftp-data).
- connect_from_port_20=YES
- #
- # If you want, you can arrange for uploaded anonymous files to be owned by
- # a different user. Note! Using "root" for uploaded files is not
- # recommended!
- #chown_uploads=YES
- #chown_username=whoever
- #
- # You may override where the log file goes if you like. The default is shown
- # below.
- #xferlog_file=/var/log/vsftpd.log
- #
- # If you want, you can have your log file in standard ftpd xferlog format.
- # Note that the default log file location is /var/log/xferlog in this case.
- #xferlog_std_format=YES
- #
- # You may change the default value for timing out an idle session.
- #idle_session_timeout=600
- #
- # You may change the default value for timing out a data connection.
- #data_connection_timeout=120
- #
- # It is recommended that you define on your system a unique user which the
- # ftp server can use as a totally isolated and unprivileged user.
- #nopriv_user=ftpsecure
- #
- # Enable this and the server will recognise asynchronous ABOR requests. Not
- # recommended for security (the code is non-trivial). Not enabling it,
- # however, may confuse older FTP clients.
- #async_abor_enable=YES
- #
- # By default the server will pretend to allow ASCII mode but in fact ignore
- # the request. Turn on the below options to have the server actually do ASCII
- # mangling on files when in ASCII mode.
- # Beware that on some FTP servers, ASCII support allows a denial of service
- # attack (DoS) via the command "SIZE /big/file" in ASCII mode. vsftpd
- # predicted this attack and has always been safe, reporting the size of the
- # raw file.
- # ASCII mangling is a horrible feature of the protocol.
- #ascii_upload_enable=YES
- #ascii_download_enable=YES
- #
- # You may fully customise the login banner string:
- #ftpd_banner=Welcome to blah FTP service.
- #
- # You may specify a file of disallowed anonymous e-mail addresses. Apparently
- # useful for combatting certain DoS attacks.
- #deny_email_enable=YES
- # (default follows)
- #banned_email_file=/etc/vsftpd.banned_emails
- #
- # You may restrict local users to their home directories. See the FAQ for
- # the possible risks in this before using chroot_local_user or
- # chroot_list_enable below.
- #chroot_local_user=YES
- #
- # You may specify an explicit list of local users to chroot() to their home
- # directory. If chroot_local_user is YES, then this list becomes a list of
- # users to NOT chroot().
- # (Warning! chroot'ing can be very dangerous. If using chroot, make sure that
- # the user does not have write access to the top level directory within the
- # chroot)
- #chroot_local_user=YES
- #chroot_list_enable=YES
- # (default follows)
- #chroot_list_file=/etc/vsftpd.chroot_list
- #
- # You may activate the "-R" option to the builtin ls. This is disabled by
- # default to avoid remote users being able to cause excessive I/O on large
- # sites. However, some broken FTP clients such as "ncftp" and "mirror" assume
- # the presence of the "-R" option, so there is a strong case for enabling it.
- #ls_recurse_enable=YES
- #
- # Customization
- #
- # Some of vsftpd's settings don't fit the filesystem layout by
- # default.
- #
- # This option should be the name of a directory which is empty. Also, the
- # directory should not be writable by the ftp user. This directory is used
- # as a secure chroot() jail at times vsftpd does not require filesystem
- # access.
- secure_chroot_dir=/var/run/vsftpd/empty
- #
- # This string is the name of the PAM service vsftpd will use.
- pam_service_name=vsftpd
- #
- # This option specifies the location of the RSA certificate to use for SSL
- # encrypted connections.
- rsa_cert_file=/etc/ssl/certs/ssl-cert-snakeoil.pem
- rsa_private_key_file=/etc/ssl/private/ssl-cert-snakeoil.key
- ssl_enable=NO
- #
- # Uncomment this to indicate that vsftpd use a utf8 filesystem.
- #utf8_filesystem=YES
- #家目录
- anon_root=/home/dql/ftps
- local_root=/home/dql/ftps
- anonymous_enable=NO
- no_anon_password=YES
- write_enable=YES
- anon_upload_enable=YES
- anon_mkdir_write_enable=YES
- listen=YES
- listen_ipv6=NO
- connect_from_port_20=YES
- local_enable=YES
- #锁定用户到自己的家目录中
- chroot_local_user=YES
- allow_writeable_chroot=YES
- secure_chroot_dir=/var/run/vsftpd/empty
- pam_service_name=vsftpd
- pasv_enable=YES
- pasv_min_port=40000
- pasv_max_port=45000
- #vsftpd.userlist是白名单
- userlist_enable=YES
- userlist_file=/etc/vsftpd.userlist
- userlist_deny=NO
- ssl_enable=YES
- allow_anon_ssl=NO
- force_local_data_ssl=YES
- force_local_logins_ssl=YES
- rsa_cert_file=/etc/ssl/certs/vsftpd.crt
- rsa_private_key_file=/etc/ssl/private/vsftpd.key
- #TSL is more secure than SSL
- ssl_tlsv1=YES
- ssl_sslv2=NO
- ssl_sslv3=NO
- require_ssl_reuse=YES
- ssl_ciphers=HIGH
- #Enable SSL debugging to store all VSFTPD log.
- debug_ssl=YES
- xferlog_enable=YES
- xferlog_std_format=YES
- xferlog_file=/var/log/xferlog
三、板子上部署ftps
新建ftp用户并设置密码
adduser dql
passwd dql
这时候在/home目录下面生成了用户文件夹dql,进入/home/dql目录,新建文件夹ftps作为FTPS服务的根目录,注意修改dql文件夹及其下面的文件所有者、用户组为dql.
/etc/vsftpd.userlist是白名单,内容如下:
必须严格按照本文说明的目录来,不能将openssl交叉编译好后放在任意目录,然后在这里指定头文件和动态库引用目录。
这是楼主实测得出的结论,否则后面运行时,会报错,除非你嵌入式板子上的文件系统目录结构和交叉编译用的主机一样。
|